gpt4 book ai didi

c# - 如何使用 IEnumerable 结果正确集成测试 Web Api Controller ?

转载 作者:太空狗 更新时间:2023-10-30 00:40:03 25 4
gpt4 key购买 nike

原来的问题有点不对,因为问题只发生在 Controller 测试期间How to return correct status code when enumeration of IEnumerable fails. ASP.NET WebApi

问题是当 IEnumerable 在延迟执行期间可能抛出异常时,如何正确测试返回 IEnumerable 的 Web API Controller ?

例如我有这样的 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();
}

但是,如果在 Controller 本身内部转换 ToList,则此测试将不会通过。

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

最佳答案

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

您当前的测试永远不会遇到媒体类型格式化程序或 web api 管道的其他可能出现问题的部分。

我建议使用 Microsoft.Owin.Testing测试项目中的 nuget 包。这将允许您在内存中的 Web 服务器中设置 Web API Controller 以进行测试,这将涵盖更多的 Web API 管道。

从您的代码片段来看,您的 Web API Controller 对 System.Web 没有任何依赖性,因此使用 OWIN 进行测试可能适合您的需要。当然,这将涵盖任何特定于您的 IIS 设置或 IIS 管道中 Web API 之外的任何内容。但是,如果您不在 Controller 操作中使用 ToList(),它将捕获延迟执行 Linq 查询 时抛出的异常。

要使用 Owin 和 Owin 测试,您需要执行以下步骤:

1。添加Microsoft.Owin将 nuget 包添加到包含您要测试的 Web API Controller 的 Web 项目。

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.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 内部类派生自第二步中在您的 Web 项目中创建的 Startup 类,这将确保 Web API 从网络项目。还有其他方法,但这种方法很简单,而且如果您使用的是 Owin,它的好处是能够重用实际应用程序中的初始化代码。

6.利润

关于c# - 如何使用 IEnumerable 结果正确集成测试 Web Api Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31451966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com