将 AspNetCore TestServer 配置为 return 500 而不是抛出异常
Configure AspNetCore TestServer to return 500 instead of throwing exception
我正在开发一个 Web API,在某些情况下会以 500 响应(我知道设计丑陋,但无能为力)。在测试中有一个 ApiFixture 包含 AspNetCore.TestHost:
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 响应,而我得到的是在测试控制器中引发的异常。我知道在测试中它可能是一个不错的功能,但我不想要那个 - 我想测试控制器的实际行为,这是 returning 内部服务器错误。有没有办法将 TestServer 重新配置为 return 响应?
控制器动作中的代码无关紧要,可以是throw 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
的子 class 并覆盖 Configure
方法以仅在那里调用 UseMiddleware
。那么您将只需要在测试中使用新的 TestStartup
class。
我正在开发一个 Web API,在某些情况下会以 500 响应(我知道设计丑陋,但无能为力)。在测试中有一个 ApiFixture 包含 AspNetCore.TestHost:
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 响应,而我得到的是在测试控制器中引发的异常。我知道在测试中它可能是一个不错的功能,但我不想要那个 - 我想测试控制器的实际行为,这是 returning 内部服务器错误。有没有办法将 TestServer 重新配置为 return 响应?
控制器动作中的代码无关紧要,可以是throw 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
的子 class 并覆盖 Configure
方法以仅在那里调用 UseMiddleware
。那么您将只需要在测试中使用新的 TestStartup
class。