我正在尝试使用自定义错误处理程序为我的 .NET Core 3 API 返回格式正确的异常。处理程序工作得很好,我遇到的问题是编写适当的单元测试来测试处理程序。我为此注册了中间件,如下所示:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IEnvService envService)
{
if (envService.IsNonProductionEnv())
{
app.UseExceptionHandler("/Error-descriptive");
}
else
{
app.UseExceptionHandler("/Error");
}
...
}
Run Code Online (Sandbox Code Playgroud)
以下是“错误描述”端点的代码:
public IActionResult ErrorDescriptive()
{
if (!_env.IsNonProductionEnv())
throw new InvalidOperationException("This endpoint cannot be invoked in a production environment.");
IExceptionHandlerFeature exFeature = HttpContext.Features.Get<IExceptionHandlerFeature>();
return Problem(detail: exFeature.Error.StackTrace, title: exFeature.Error.Message);
}
Run Code Online (Sandbox Code Playgroud)
我具体处理的问题是这一行:
IExceptionHandlerFeature exFeature = HttpContext.Features.Get<IExceptionHandlerFeature>();
Run Code Online (Sandbox Code Playgroud)
从单元测试的角度来看,我很难让它工作,因为(据我所知)这行代码从服务器获取了最新的异常。有没有一种方法可以在我的测试中设置从 HttpContext 获得的异常?另外,由于这是使用 HttpContext,我是否还需要合并它的模拟版本,例如 DefaultHttpContext?
我有一个 .NET Core 3.1 API,它有两个端点,我用它来测试我正在编写的一些错误处理中间件。我正在使用 Swagger UI 来测试这个 API。
我遇到的问题是,如果在执行 POST 请求期间引发任何类型的异常,它将作为 405 响应返回,甚至不会触发我正在编写的错误处理中间件。我的 API 上的所有 POST 请求都会发生这种情况,而不仅仅是我展示的测试请求。
我决定尝试一个同样简单的 GET 方法,令我惊讶的是,当其中抛出异常时,它会触发我的错误处理中间件,然后将 500 响应写回调用者。这是整个控制器代码:
[Route("api/[controller]")]
[ApiController]
public class TestingController : ControllerBase
{
[HttpPost]
[Route("TestPost")]
public IActionResult TestPost([FromBody] string test)
{
throw new Exception();
}
[HttpGet]
[Route("TestGet/{test}")]
public IActionResult TestGet(string test)
{
throw new Exception();
}
}
Run Code Online (Sandbox Code Playgroud)
那么为什么 POST 方法在发生异常时会返回 405 响应,而 GET 方法会返回 500 响应呢?
编辑:这是我正在发出的示例 POST 请求
请求网址:https://localhost:44387/api/Testing/TestPost
请求正文(JSON):“测试”
以下是我从 POST 收到的响应标头:
允许:GET 缓存控制:无缓存 日期:2020 年 2 月 19 …