C# 如何使用IEnumerable结果正确地集成测试Web Api控制器?
最初的问题有点不正确,因为问题只发生在控制器测试期间 问题是,当IEnumerable在延迟执行期间可能引发异常时,如何正确测试返回IEnumerable的web api控制器 例如,我有这样的API端点:C# 如何使用IEnumerable结果正确地集成测试Web Api控制器?,c#,asp.net,asp.net-mvc,linq,C#,Asp.net,Asp.net Mvc,Linq,最初的问题有点不正确,因为问题只发生在控制器测试期间 问题是,当IEnumerable在延迟执行期间可能引发异常时,如何正确测试返回IEnumerable的web api控制器 例如,我有这样的API端点: public class EntityController : ApiController { ... public IHttpActionResult Get() { return Ok(Session.Query<Entity>());
public class EntityController : ApiController
{
...
public IHttpActionResult Get()
{
return Ok(Session.Query<Entity>());
}
}
但是,如果将ToList置于控制器内部,则该测试将无法通过
public class EntityController : ApiController
{
...
public IHttpActionResult Get()
{
return Ok(Session.Query<Entity>().ToList());
}
}
公共类EntityController:ApicController
{
...
public IHttpActionResult Get()
{
返回Ok(Session.Query().ToList());
}
}
在我看来,您似乎希望创建集成测试来测试web api端点
您当前的测试不会影响媒体类型格式化程序或web api管道中可能出现问题的其他部分
我建议在测试项目中使用nuget包。这将允许您在内存中的web服务器中设置web api控制器以进行测试,该测试将覆盖更多的web api管道
根据您的代码片段判断,您的web api控制器不依赖于System.web
,因此使用OWIN进行测试可能适合您的需要。当然,这将不涵盖特定于IIS设置的任何内容或web api之外的IIS管道中的任何内容。但是,如果在控制器操作中不使用ToList()
,它将捕获延迟执行Linq查询时引发的异常
要使用Owin和Owin测试,您需要遵循以下步骤:
一,。将nuget包添加到包含要测试的web api控制器的web项目中
二,。将Owin启动类添加到该web项目:
我们将覆盖测试项目中的配置
方法
三,。将nuget包添加到测试项目中
四,。将nuget包添加到测试项目中
五,。在测试项目中创建测试类:
公共类TestClass{
私有类TestStartup:Startup{
公共覆盖无效配置(IAppBuilder应用程序){
//在这里设置web api、IoC等吗
var config=新的HttpConfiguration();
config.maphttpAttribute路由();
//…等等
app.UseWebApi(配置);
}
}
[测试]
公共无效MyTest(){
//安排
使用(var server=TestServer.Create()){
//表演
var response=server.CreateRequest(“api/someroute/”).GetAsync().Result;
//核实
Assert.Equal(HttpStatusCode.InternalServerError,response.StatusCode);
}
}
}
确保TestStartup
内部类派生自步骤2中在web项目中创建的Startup
类,这将确保web api从web项目中获取控制器。还有其他方法,但这很简单,并且如果使用Owin,可以重用来自实际应用程序的初始化代码
六,。Profit您是否在实际应用程序中使用OWIN?否,实际应用程序托管在IIS中,但在部署之前,所有控制器都已通过针对数据库的集成测试
public class EntityController : ApiController
{
...
public IHttpActionResult Get()
{
return Ok(Session.Query<Entity>().ToList());
}
}
public class Startup {
public virtual void Configuration(IAppBuilder builder) {
// if you want to move all your web api initialization
// and configuration to here then you can.
// Otherwise just leave this method empty
}
}
public class TestClass {
private class TestStartup : Startup {
public override void Configuration(IAppBuilder app) {
// do your web api, IoC, etc setup here
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
// ...etc
app.UseWebApi(config);
}
}
[Test]
public void MyTest() {
// arrange
using (var server = TestServer.Create<TestStartup>()) {
// act
var response = server.CreateRequest("api/someroute/").GetAsync().Result;
// verify
Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
}
}
}