gpt4 book ai didi

c# - 配置 AspNetCore TestServer 返回 500 而不是抛出异常

转载 作者:行者123 更新时间:2023-12-02 06:08:18 25 4
gpt4 key购买 nike

我正在开发一个 Web API,在某些情况下会响应 500(我知道设计很丑,但对此无能为力)。在测试中,有一个包含 AspNetCore.TestHost 的 ApiFixture:

public class ApiFixture
{
public TestServer ApiServer { get; }
public HttpClient HttpClient { get; }

public ApiFixture()
{
var config = new ConfigurationBuilder()
.AddEnvironmentVariables()
.Build();

var path = Assembly.GetAssembly(typeof(ApiFixture)).Location;
var hostBuilder = new WebHostBuilder()
.UseContentRoot(Path.GetDirectoryName(path))
.UseConfiguration(config)
.UseStartup<Startup>();

ApiServer = new TestServer(hostBuilder);
HttpClient = ApiServer.CreateClient();
}
}

当我从这个固定装置中使用 HttpClient 调用 API 端点时,它应该响应 500,而不是我收到在测试的 Controller 中引发的异常。我知道在测试中这可能是一个不错的功能,但我不希望这样 - 我想测试 Controller 的实际行为,它返回内部服务器错误。有没有办法重新配置 TestServer 以返回响应?

Controller 操作中的代码不相关,可以抛出 new Exception();

最佳答案

您可以创建异常处理中间件并在测试中使用它,或者更好的是始终使用它

public class ExceptionMiddleware
{
private readonly RequestDelegate next;

public ExceptionMiddleware(RequestDelegate next)
{
this.next = next;
}

public async Task Invoke(HttpContext httpContext)
{
try
{
await this.next(httpContext);
}
catch (Exception ex)
{
httpContext.Response.ContentType = MediaTypeNames.Text.Plain;
httpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
await httpContext.Response.WriteAsync("Internal server error!");
}
}
}

现在您可以在 Startup.cs 中注册此中间件:

...
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMiddleware<ExceptionMiddleware>();
...
app.UseMvc();
}

如果您不想一直使用它,您可以创建 TestStartup - Startup 的子类并覆盖 Configure > 仅在那里调用 UseMiddleware 的方法。然后,您将需要仅在测试中使用新的 TestStartup 类。

关于c# - 配置 AspNetCore TestServer 返回 500 而不是抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53514422/

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