C# ASP.NET单元测试没有';t地图路线
我有一个WebAPI项目,我想用单元测试来测试它 在测试类中,我创建了一个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
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
}