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

时间:2018-10-31 12:50:30

标签: c# unit-testing asp.net-core xunit xunit.net

我有一个用.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。像

Assert.Equal(500, response.StatusCode);

调试时,我看到响应的结果返回类型(Microsoft.AspNetCore.Mvc.ObjectResult)的StatusCode为500。

但是当我尝试这样做时:

response.StatusCode

它引发了我错误:

  

'IActionResult'不包含'StatusCode'的定义,找不到可以接受类型为'IActionResult'的第一个参数的扩展方法'StatusCode'(您是否缺少using指令或程序集引用?)

我该如何解决?

2 个答案:

答案 0 :(得分:4)

将响应投射到所需的类型并访问该成员以进行断言。

请注意,经过测试的操作会返回Task,因此应将测试更新为异步

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

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

    // Assert
    Assert.IsType<ObjectResult>(response);

    var objectResponse = response as ObjectResult; //Cast to desired type

    Assert.Equal(500, objectResponse.StatusCode);
}

答案 1 :(得分:0)

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

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