如何正确集成测试Web Api控制器与IEnumerable结果

本文关键字:IEnumerable 结果 控制器 Api 何正确 集成测试 Web | 更新日期: 2023-09-27 18:02:55

原来的问题有点不正确,因为问题只发生在控制器测试期间如何在IEnumerable枚举失败时返回正确的状态码。ASP。净WebApi

问题是如何正确测试web api控制器返回IEnumerable时,IEnumerable可能会抛出一个异常在延迟执行?

。我有这样的API端点:

public class EntityController : ApiController
{
    ...
    public IHttpActionResult Get()
    {
        return Ok(Session.Query<Entity>());
    }
}

无论在查询执行过程中可能抛出异常,相应的测试都将通过。

[Test]
public async Task Test()
{
     var entityController = new EntityController(Session)
                {
                    Configuration = new HttpConfiguration(),
                    Request = new HttpRequestMessage()
                };
    var response = await entityController.GetAll().ExecuteAsync(new CancellationTokenSource().Token);
    response.EnsureSuccessStatusCode();
}

但是,如果在控制器内部强制转换ToList,则此测试将不通过。

public class EntityController : ApiController
{
    ...
    public IHttpActionResult Get()
    {
        return Ok(Session.Query<Entity>().ToList());
    }
}

如何正确集成测试Web Api控制器与IEnumerable结果

在我看来,您想创建集成测试来测试您的web api端点。

你当前的测试不会碰到媒体类型格式化器或其他可能出现问题的web api管道部分。

我建议在您的测试项目中使用microsoft . win. testing工具包。这将允许你在内存中的web服务器上设置你的web api控制器来进行测试,这将涵盖更多的web api管道。

根据你的代码片段判断,你的web api控制器对System.Web没有任何依赖,所以使用OWIN进行测试可能适合你的需要。当然,这将涵盖任何特定于您的IIS设置或IIS管道中web api之外的任何内容。但是,如果您在控制器操作中不使用ToList(),它将捕获从延迟执行Linq query抛出的异常。

要使用Owin和Owin测试,您需要遵循以下步骤:

1。添加微软。

2。在web项目中添加Owin Startup类:

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
    }
}

我们将在测试项目中重写Configuration方法。

3。将Microsoft.AspNet.WebApi.Owin nuget包添加到您的测试项目

4。将microsoft . win. testing工具包添加到您的测试项目中

5。在测试项目中创建一个Test类:

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);
        }
    }
}

确保TestStartup内部类来源于第二步在web项目中创建的Startup类,这将确保web api将从web项目中获取控制器。还有其他方法,但这很简单,并且如果您使用Owin,则可以重用实际应用程序中的初始化代码。

6。利润