在 .Net 核心网络中使用 Xunit API - 如何测试/传递 500 状态码

Using Xunit in .Net core web API - How to test/ pass 500 status code

我们正在为我们的 .Net 核心 3.1 Web API 尝试测试驱动开发,并为此使用 XUnit。

在我的控制器中,我有针对状态代码 200,404 和其他场景编写的测试用例或 [Fact]。

关于单元测试 500 内部服务器错误 - 我不确定如何传递代码,或如何声明它。

我使用下面的代码总是失败。

如何在我的单元测试中成功测试 500 - 内部服务器错误

我是 TDD 的新手,任何评论都有帮助,下面是代码:

[Fact] // 404 Sample unit test method
public async Task Get_OnNotFound_Returns404()
{
    // Arrange
    var mockService = new Mock<IService>();

    mockService.Setup(service => service.GetTypes(It.IsAny<string>(), 
        It.IsAny<CancellationToken>())).ReturnsAsync(new List<TypeResponse>());

    var sut = new HomeController(mockService.Object);

    //Act
    var result = await sut.GetSampleMethod("foo") as ObjectResult;

    //Assert

    Assert.Equal(StatusCodes.Status404NotFound, result.StatusCode);
}


// Below is my always failing 500 code unit test

[Fact]
public async Task Returns_500_When_Returns_Error()
{
    // Arrange
    var mockService = new Mock<IService>();

    mockService.Setup(service => service.GetTypes(It.IsAny<string>(),
        It.IsAny<CancellationToken>())).ReturnsAsync(new List<TypeResponse>());

    var sut = new HomeController(mockService.Object);

    //Act
    var result = await GetSampleMethod("foo") as ObjectResult;

    //Assert
    Assert.Equal(StatusCodes.Status500InternalServerError, result.StatusCode);
}

下面是我的控制器方法:

[HttpGet]
public async Task<IActionResult> GetSampleMethod(string id, 
    CancellationToken cancellationToken)
{
    try
    {
        var result = await _service.GetSampleMethod(id, cancellationToken);
        if (result.Any())
        {
            return Ok(result);
        }

        return StatusCode(StatusCodes.Status404NotFound,
            new Error { Message = "No Records ." });
    }
    catch (Exception ex)
    {
        return StatusCode(StatusCodes.Status500InternalServerError,
            new Error
            {
                Message = !string.IsNullOrWhiteSpace(ex.Message)
                    ? ex.Message : "An unhandled error occurred."
            });
    }
}

很明显你的方法 returns Status500InternalServerError 以防出现异常。所以你必须为它模拟一个异常:

mockService.Setup(service => service.GetTypes(It.IsAny<string>(),
     It.IsAny<CancellationToken>()))
       .Throws(new Exception());