小编der*_*tda的帖子

如何对异常处理程序中间件进行单元测试

我正在尝试使用自定义错误处理程序为我的 .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?

c# unit-testing asp.net-core asp.net-core-webapi

5
推荐指数
1
解决办法
8181
查看次数

POST 方法总是返回 405 响应

我有一个 .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 …

c# asp.net-core asp.net-core-webapi

2
推荐指数
1
解决办法
1715
查看次数