Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.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# ASP.NET单元测试没有';t地图路线_C#_Asp.net_Integration Testing_Asp.net Web Api Routing_Attributerouting - Fatal编程技术网

C# ASP.NET单元测试没有';t地图路线

C# ASP.NET单元测试没有';t地图路线,c#,asp.net,integration-testing,asp.net-web-api-routing,attributerouting,C#,Asp.net,Integration Testing,Asp.net Web Api Routing,Attributerouting,我有一个WebAPI项目,我想用单元测试来测试它 在测试类中,我创建了一个HttpClient,它应该将HTTP调用直接重定向到我的控制器: public static HttpClient GetInMemoryServerClient(HttpConfiguration serverConfig) { var config = serverConfig ?? new HttpConfiguration(); MyService.WebApiConfig.Register(co

我有一个WebAPI项目,我想用单元测试来测试它

在测试类中,我创建了一个
HttpClient
,它应该将HTTP调用直接重定向到我的控制器:

public static HttpClient GetInMemoryServerClient(HttpConfiguration serverConfig)
{
    var config = serverConfig ?? new HttpConfiguration();
    MyService.WebApiConfig.Register(config, isTest: true);
    var server = new HttpServer();
    server.Configuration.Services.Replace(typeof(IHttpActionInvoker), server.Configuration.Services.GetActionInvoker());
    return new HttpClient(server) { BaseAddress = new Uri("http://fakehost:9999/") };
}
在服务项目中,我有一个调用
config.MapHttpAttributeRoutes()
的类,它在prod中工作,但在被测试调用时不工作:

public class WebApiConfig{
    //...
    public static void Register(HttpConfiguration config) // this is called in Global.asax.cs
    {
        Register(config, false);
    }

    public static Register(HttpConfiguration config, bool isTest){
        //... various config and dependency injection setup here
        config.MapHttpAttributeRoutes();
    }
}
我的控制器使用属性路由:

[RoutePrefix("api/groups/{groupId}/sets/{setId:minlength(1)}/items")]
public class ItemsController : BaseController
{
    [Route("{itemId:minlength(1)}")]
    [HttpGet]
    public async Task<API.Item> Get(string groupId, string setId, string itemId)
    {...}
}
[RoutePrefix(“api/groups/{groupId}/sets/{setId:minlength(1)}/items”)]
公共类ItemsController:BaseController
{
[路由(“{itemId:minlength(1)}”)]
[HttpGet]
公共异步任务Get(字符串groupId、字符串setId、字符串itemId)
{...}
}
当我使用
HttpClient
拨打电话时

{“Message”:“未找到与请求URI匹配的HTTP资源
'http://fakehost:9999/api/groups/abc/sets/xyz/items/item123“
”}

并使用调试器检查
httpClient
,我看到
httpClient.handler.Configuration.Routes.Count==0
,因此映射路由属性不起作用


Q:设置假的
HttpClient
以便我的单元测试可以使用它调用控制器的正确方法是什么?

HttpConfiguration config
未分配给服务器,因此未应用设置。该方法将映射应用于配置,但在初始化配置时未将其分配给服务器

public static HttpClient GetInMemoryServerClient(HttpConfiguration serverConfig = null) {
    var config = serverConfig ?? new HttpConfiguration();
    MyService.WebApiConfig.Register(config, isTest: true);
    var server = new HttpServer(config); //<-- pass config to server        
    var client = new HttpClient(server);
    //Server defaults to localhost so setting client to localhost as well
    client.BaseAddress = new Uri("http://localhost"); 
    return client;
}

你看过这里吗?在测试中使用时,服务器默认为
localhost
。所以你的默认地址不起作用。此外,这将被归类为集成测试。不是单元测试。看看我是如何在这个答案中做类似的事情的。
using(var client = GetInMemoryServerClient()) {
    var url = "api/groups/abc/sets/xyz/items/item123";
    var response = await client.GetAsync(url);
    //...do something with response
}