Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试以确保只有选定的HTTP谓词适用于WebAPI_C#_Unit Testing_Asp.net Mvc 4_Asp.net Web Api_Asp.net Web Api Helppages - Fatal编程技术网

C# 单元测试以确保只有选定的HTTP谓词适用于WebAPI

C# 单元测试以确保只有选定的HTTP谓词适用于WebAPI,c#,unit-testing,asp.net-mvc-4,asp.net-web-api,asp.net-web-api-helppages,C#,Unit Testing,Asp.net Mvc 4,Asp.net Web Api,Asp.net Web Api Helppages,使用WebAPI 我们创建的测试之一是确保对于特定的控制器,只在允许的情况下获取谓词 已经编写了一个使用MVC帮助页的测试 HttpSelfHostConfiguration config = new HttpSelfHostConfiguration(baseAddress); config.Routes.MapHttpRoute( "SearchAPI", "api/{controller}/{id}"); HttpSelfHostServer server = new

使用WebAPI

我们创建的测试之一是确保对于特定的控制器,只在允许的情况下获取谓词

已经编写了一个使用MVC帮助页的测试

HttpSelfHostConfiguration config = new HttpSelfHostConfiguration(baseAddress);
config.Routes.MapHttpRoute(
    "SearchAPI", 
    "api/{controller}/{id}");

HttpSelfHostServer server = new HttpSelfHostServer(config);
server.OpenAsync().Wait();
IApiExplorer apiExplorer = config.Services.GetApiExplorer();
var apiDescriptions = apiExplorer.ApiDescriptions;
var data = from description in apiDescriptions
           where description.ActionDescriptor.ControllerDescriptor.ControllerType.FullName.StartsWith("MySite.Presentation.Pages.SearchAPI")
           orderby description.RelativePath
           select description
           ;
foreach (var apiDescription in data)
{
    Assert.That(apiDescription.HttpMethod, Is.EqualTo(HttpMethod.Get), string.Format("Method not Allowed: {0} {1}", apiDescription.RelativePath, apiDescription.HttpMethod));
}
现在,这个测试虽然可能不是确保我们的控制器只获取HTTP谓词方法(如果适用)的最佳方法,但它起作用了

我们现在已经升级到MVC5,而这个测试现在失败了。因为HttpSelfHostServer不再可用

查看Microsoft的msdn库,我们不建议您使用HttpSelfHostServer,而是鼓励您使用Owin

我从一个新的Owin班开始

public class OwinStartUp
{
    public void Configuration(IAppBuilder appBuilder)
    {
        var config = new HttpConfiguration();
        config.Routes.MapHttpRoute(
            name: "SearchAPI",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        AreaRegistration.RegisterAllAreas();
        appBuilder.UseWebApi(config); 
    }
}
但说到考试,这是我所能做到的

        string baseAddress = "http://localhost/bar";
        using (var server = WebApp.Start<OwinStartUp>(url: baseAddress))
        {


        }
字符串基地址=”http://localhost/bar";
使用(var server=WebApp.Start(url:baseAddress))
{
}
我不知道如何从配置中访问服务,然后才能调用GetApiExplorer方法,因为Intellisense建议的服务器变量上没有公共方法

我一直在看一些展示如何使用Owin的网站,但它们并没有帮助我解决这个问题:

也存在这一问题 但这并没有帮助我解决问题


我需要做什么,为了能够编写一个单元测试来确保控制器/方法只允许特定的HTTP谓词,或者如何配置Owin来使用API帮助页对于您的场景,您不需要启动服务器,例如,您可以只执行以下操作来获得API描述。请注意,为了获取api描述,api资源管理器不需要执行实际请求来获取api描述

HttpSelfHostConfiguration config = new HttpSelfHostConfiguration(baseAddress);
config.Routes.MapHttpRoute(
    "SearchAPI", 
    "api/{controller}/{id}");

HttpSelfHostServer server = new HttpSelfHostServer(config);
server.OpenAsync().Wait();
IApiExplorer apiExplorer = config.Services.GetApiExplorer();
var apiDescriptions = apiExplorer.ApiDescriptions;
var data = from description in apiDescriptions
           where description.ActionDescriptor.ControllerDescriptor.ControllerType.FullName.StartsWith("MySite.Presentation.Pages.SearchAPI")
           orderby description.RelativePath
           select description
           ;
foreach (var apiDescription in data)
{
    Assert.That(apiDescription.HttpMethod, Is.EqualTo(HttpMethod.Get), string.Format("Method not Allowed: {0} {1}", apiDescription.RelativePath, apiDescription.HttpMethod));
}
var config = new HttpConfiguration();

config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

IApiExplorer explorer = config.Services.GetApiExplorer();

var apiDescs = explorer.ApiDescriptions;

我有一个.NETCore3.1测试项目,使用XUnit测试ASP.NETMVC项目。以下测试确保所有控制器都有一个与之关联的HTTP谓词(例如,有人没有忘记添加一个或多个)。这个问题帮助我达到了目的,所以我将我的测试发布在这里:

[事实]
公共无效控制器\u所有\u都有\u Http\u动词()
{
var methodsMissingHttpVerbs=程序集
.GetAssembly(typeof(HomeController)).GetTypes()
.Where(type=>typeof(Controller).IsAssignableFrom(type))
.SelectMany(type=>type.GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public))
.Where(m=>!m.GetCustomAttributes(typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute),true)。Any()
.Count(c=>c.GetCustomAttribute()==null&&
c、 GetCustomAttribute()==null&&
c、 GetCustomAttribute()=空);
Assert.Equal(0,methodsMissingHttpVerbs);
}

添加ApiController当前所在的程序集必须由AppDomain加载,这将非常有帮助。在封面下,API资源管理器从DefaultHttpControllerTypeResolver枚举控制器,后者反过来使用DefaultAssemblyResolver,它只返回AppDomain.CurrentDomain.GetAssemblys()。如果testmethod中没有对控制器所在程序集中的某个类型的引用,则此程序集当前不在列表中,因此APIdescription将为空。