通过自托管路由和集成测试 web api
routing and integration testing webapi via selfhosting
我正在使用此代码:
[Fact]
public void ValueController_WithGetMethos_ShouldReturnValidData_NoBaseClass()
{
var configuration = new HttpSelfHostConfiguration("http://localhost:64466");
configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
configuration.Services.Replace(typeof(IAssembliesResolver), new WebApiClassBase.TestAssemblyResolver(typeof(ValuesController)));
configuration.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var server = new HttpSelfHostServer(configuration);
try
{
server.OpenAsync().Wait();
var request = new HttpRequestMessage
{
RequestUri = new Uri("http://localhost:64466/api/values"),
Method = HttpMethod.Get
};
var client = new HttpClient(server);
using (HttpResponseMessage response = client.SendAsync(request).Result)
{
response.Should().Not.Be.Null();
response.IsSuccessStatusCode.Should().Be.True();
string[] result = response.Content.ReadAsAsync<string[]>().Result;
result.Length.Should().Be.EqualTo(4);
result[0].Should().Be.EqualTo("http://tostring.it");
result[1].Should().Be.EqualTo("http://imperugo.tostring.it");
result[2].Should().Be.EqualTo("http://twitter.com/imperugo");
result[3].Should().Be.EqualTo("http://www.linkedin.com/in/imperugo");
}
}
finally
{
configuration.Dispose();
server.Dispose();
}
}
灵感来自 this, which also contains the relevant ValuesController。我注意到我必须调整路由:
configuration.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
根据我的 WebApiConfig 中的那个。但是,当我尝试访问具有如下属性路由的 Action 时:
Route("Calculator/AddTwoNumbers/a/{a}/b/{a}")]
public IHttpActionResult AddTwoNumbers(PayLoad payLoad)
我收到 404 - 未找到错误。我还必须定义这个声明式路由吗?如果是这样,集成测试似乎很乏味。任何反馈将不胜感激。谢谢。
PS:
我试过了:
configuration.MapHttpAttributeRoutes();
这似乎没有帮助
在配置默认路由之前,您需要先设置 AttributeRouting。
configuration.MapHttpAttributeRoutes();
configuration.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
路由按添加到 RouteCollection
的顺序进行评估。如果您的默认路由排在第一位,那么它将在您的属性路由有机会匹配之前匹配传入路由。
我正在使用此代码:
[Fact]
public void ValueController_WithGetMethos_ShouldReturnValidData_NoBaseClass()
{
var configuration = new HttpSelfHostConfiguration("http://localhost:64466");
configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
configuration.Services.Replace(typeof(IAssembliesResolver), new WebApiClassBase.TestAssemblyResolver(typeof(ValuesController)));
configuration.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var server = new HttpSelfHostServer(configuration);
try
{
server.OpenAsync().Wait();
var request = new HttpRequestMessage
{
RequestUri = new Uri("http://localhost:64466/api/values"),
Method = HttpMethod.Get
};
var client = new HttpClient(server);
using (HttpResponseMessage response = client.SendAsync(request).Result)
{
response.Should().Not.Be.Null();
response.IsSuccessStatusCode.Should().Be.True();
string[] result = response.Content.ReadAsAsync<string[]>().Result;
result.Length.Should().Be.EqualTo(4);
result[0].Should().Be.EqualTo("http://tostring.it");
result[1].Should().Be.EqualTo("http://imperugo.tostring.it");
result[2].Should().Be.EqualTo("http://twitter.com/imperugo");
result[3].Should().Be.EqualTo("http://www.linkedin.com/in/imperugo");
}
}
finally
{
configuration.Dispose();
server.Dispose();
}
}
灵感来自 this, which also contains the relevant ValuesController。我注意到我必须调整路由:
configuration.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
根据我的 WebApiConfig 中的那个。但是,当我尝试访问具有如下属性路由的 Action 时:
Route("Calculator/AddTwoNumbers/a/{a}/b/{a}")]
public IHttpActionResult AddTwoNumbers(PayLoad payLoad)
我收到 404 - 未找到错误。我还必须定义这个声明式路由吗?如果是这样,集成测试似乎很乏味。任何反馈将不胜感激。谢谢。
PS:
我试过了:
configuration.MapHttpAttributeRoutes();
这似乎没有帮助
在配置默认路由之前,您需要先设置 AttributeRouting。
configuration.MapHttpAttributeRoutes();
configuration.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
路由按添加到 RouteCollection
的顺序进行评估。如果您的默认路由排在第一位,那么它将在您的属性路由有机会匹配之前匹配传入路由。