asp.net-mvc如何正确地集成到测试 Web Api 控制器与 IEnumerable 结果吗?

发布时间: 2017/3/25 0:49:09
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

原来的质询是有点不正确,因为只有在压力控制器的测试如何返回正确的状态代码,IEnumerable 枚举失败时出现的问题。ASP.NET 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();
}

不过这个测试将不能通过如果控制器本身内铸造一一列举。

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

解决方法 1:

看来你想要创建集成测试来测试您的 web api 终结点。

你当前的测试不会打媒体类型格式化程序或其他部位的 web api 管线可能会出现问题。

我建议在您的测试项目中使用Microsoft.Owin.Testing nuget 包。这将允许您设置您的 web api 控制器内存中 web 服务器的测试将涵盖更多的 web api 管道中。

从你的代码片段来看,您的 web api 控制器并没有任何依赖项 System.Web 所以使用浩然进行测试可能适合您的需要。当然,这将包括任何特定于您的 IIS 设置或任何 IIS 中管道的外部 web api。然而,它将捕捉的延迟执行从引发异常你 Linq query 如果你不使用 ToList() 在您的控制器操作。

要使用浩然和欧文真测试需要按照下列步骤操作︰

1.将Microsoft.Owin nuget 包添加到包含您要测试的 web api 控制器的 web 项目。

2.向该 web 项目添加欧文真启动类︰

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.Owin.Testing nuget 包添加到您的测试项目。

5.在您的测试项目中创建测试类︰

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 内部类源于 Startup 创建 web 项目中的类的第二步,这将确保该 web api 会接您从 web 项目的控制器。还有其他的方法,但这是简单的优点是能够重用实际应用程序的初始化代码,如果您在使用浩然。

6.利润

赞助商