.NET Core TestServer returns 状态 200 而不是 404 post 对不存在路径的请求
.NET Core TestServer returns status 200 instead of 404 for post request to non-existent path
我正在使用以下指南为 .NET Core 3.1 应用程序实施集成测试:https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-3.1。这是我目前的测试 class:
public class IntegrationTests : IClassFixture<WebApplicationFactory<main_app.Startup>>
{
private readonly WebApplicationFactory<main_app.Startup> _factory;
public TestTest(WebApplicationFactory<main_app.Startup> factory) {
_factory = factory;
}
[Fact]
public async void GetBogusPath() {
var client = _factory.CreateClient();
var response = await client.GetAsync("ofajspd");
Assert.False(response.IsSuccessStatusCode);
}
[Fact]
public async void PostBogusPath() {
var client = _factory.CreateClient();
var request_body = new StringContent("{}", Encoding.UTF8, "application/json");
var response = await client.PostAsync("ofajspd", request_body);
Assert.False(response.IsSuccessStatusCode);
}
}
get 请求测试按预期运行,因为它 returns 一个 404 状态代码。但是,post 请求 returns 200 状态,即使路径不存在。是什么导致了这个问题,我该如何解决?
如果我 运行 本地服务器并在一个不存在的端点手动触发 post 请求,它会按预期运行,因此问题仅限于这些集成测试。
编辑:这是我的控制器 class 定义:
[ApiController]
[ApiVersion("1")]
[Route("v{version:apiVersion}/[controller]")]
public class QueryController : ControllerBase
{
[AcceptVerbs("Post")]
public async Task<QueryResponse> Post([FromBody]QueryRequest rq) {
return await QueryHandler.HandlePost(rq, this.HttpContext);
}
}
问题是我在 Startup.cs 中附加了一个自定义的中间件,它有一个错误,所以它吞噬了其他中间件生成的 404 并输出 200。它应该处理特定类型的错误,但错误导致它处理比预期更广泛的错误。删除有问题的中间件解决了问题。
有关更多详细信息,有问题的自定义中间件正在检查其他中间件层抛出的异常中的特定 'HResult',但 HResult 值引用的 AggregateException 比特定错误抛出的频率高得多我正在寻找(在它已经开始流式传输之后正在写入响应)。
我正在使用以下指南为 .NET Core 3.1 应用程序实施集成测试:https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-3.1。这是我目前的测试 class:
public class IntegrationTests : IClassFixture<WebApplicationFactory<main_app.Startup>>
{
private readonly WebApplicationFactory<main_app.Startup> _factory;
public TestTest(WebApplicationFactory<main_app.Startup> factory) {
_factory = factory;
}
[Fact]
public async void GetBogusPath() {
var client = _factory.CreateClient();
var response = await client.GetAsync("ofajspd");
Assert.False(response.IsSuccessStatusCode);
}
[Fact]
public async void PostBogusPath() {
var client = _factory.CreateClient();
var request_body = new StringContent("{}", Encoding.UTF8, "application/json");
var response = await client.PostAsync("ofajspd", request_body);
Assert.False(response.IsSuccessStatusCode);
}
}
get 请求测试按预期运行,因为它 returns 一个 404 状态代码。但是,post 请求 returns 200 状态,即使路径不存在。是什么导致了这个问题,我该如何解决?
如果我 运行 本地服务器并在一个不存在的端点手动触发 post 请求,它会按预期运行,因此问题仅限于这些集成测试。
编辑:这是我的控制器 class 定义:
[ApiController]
[ApiVersion("1")]
[Route("v{version:apiVersion}/[controller]")]
public class QueryController : ControllerBase
{
[AcceptVerbs("Post")]
public async Task<QueryResponse> Post([FromBody]QueryRequest rq) {
return await QueryHandler.HandlePost(rq, this.HttpContext);
}
}
问题是我在 Startup.cs 中附加了一个自定义的中间件,它有一个错误,所以它吞噬了其他中间件生成的 404 并输出 200。它应该处理特定类型的错误,但错误导致它处理比预期更广泛的错误。删除有问题的中间件解决了问题。
有关更多详细信息,有问题的自定义中间件正在检查其他中间件层抛出的异常中的特定 'HResult',但 HResult 值引用的 AggregateException 比特定错误抛出的频率高得多我正在寻找(在它已经开始流式传输之后正在写入响应)。