.NET Core Xunit - IActionResult' 不包含 'StatusCode' 的定义

.NET Core Xunit - IActionResult' does not contain a definition for 'StatusCode'

我有一个用 .NET Core 编写的 API 并使用 xUnit 对其进行测试。

我在 API 中有我的方法:

[HttpDelete("api/{id}")]
public async Task<IActionResult> DeleteUserId(string id)
{
   try
    {
       //deleting from db       
    }
    catch (Exception ex)
    {           
        return StatusCode(500, ex.Message);
    }       
}

我想在 null/empty id 传递给此方法时编写单元测试。

我的测试用例为:

[Fact]
public void DeleteUserId_Test()
{
    //populate db and controller here

    var response= _myController.DeleteUserId("");  //trying to pass empty id here

    // Assert
    Assert.IsType<OkObjectResult>(response);
}

如何检查状态代码 500 是 return 从我的控制器方法调用中编辑的。像

Assert.Equal(500, response.StatusCode);

调试时我可以看到响应有结果 return 类型 (Microsoft.AspNetCore.Mvc.ObjectResult) 其中 StatusCode 为 500。

但是当我尝试这样做时:

response.StatusCode

它抛出错误:

'IActionResult' does not contain a definition for 'StatusCode' and no extension method 'StatusCode' accepting a first argument of type 'IActionResult' could be found (are you missing a using directive or an assembly reference?)

我该如何解决这个问题?

将响应转换为所需的类型并访问成员以进行断言。

注意测试的动作returns一个Task,所以测试应该更新为async

[Fact]
public async Task DeleteUserId_Test() {
    // Arrange
    // ...populate db and controller here

    // Act
    IActionResult response = await _myController.DeleteUserId("");  //trying to pass empty id here

    // Assert
    ObjectResult objectResponse = Assert.IsType<ObjectResult>(response); 
    
    Assert.Equal(500, objectResponse.StatusCode);
}

您可以使用 Assert.IsType<OkObjectResult>(response); 的 return 值来获取所需的类型:

var result = Assert.IsType<OkObjectResult>(response);
Assert.Equal(500, result.StatusCode)