【问题标题】:.NET Core Xunit - IActionResult' does not contain a definition for 'StatusCode'.NET Core Xunit - IActionResult'不包含'StatusCode'的定义
【发布时间】:2019-04-04 15:27:00
【问题描述】:

我有一个用 .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);

在调试时,我可以看到响应具有 Result 返回类型 (Microsoft.AspNetCore.Mvc.ObjectResult),其 StatusCode 为 500。

但是当我尝试这样做时:

response.StatusCode

它给我带来了错误:

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

我该如何解决这个问题?

【问题讨论】:

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

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


【解决方案1】:

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

请注意,测试操作返回Task,因此测试应更新为异步

[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);
}

【讨论】:

    【解决方案2】:

    你可以使用Assert.IsType&lt;OkObjectResult&gt;(response);的返回值来获取想要的类型:

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

    【讨论】:

    • 虽然这段代码我没有得到任何编译错误。在运行我的测试时,我得到: 预期:Microsoft.AspNetCore.Mvc.OkObjectResult 实际:System.Threading.Tasks.Task`1[[Microsoft.AspNetCore.Mvc.IActionResult, Microsoft.AspNetCore.Mvc.Abstractions, Version=2.1.0.0 , Culture=neutral, PublicKeyToken=adb9793829ddae60]]'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多