c# - .NET Core Xunit - IActionResult'不包含'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。就像是
Assert.Equal(500, response.StatusCode);
在调试时,我可以看到响应具有 Result 返回类型 (Microsoft.AspNetCore.Mvc.ObjectResult),它具有StatusCode
500。
但是当我尝试这样做时:
response.StatusCode
它向我抛出错误:
“IActionResult”不包含“StatusCode”的定义,并且找不到接受“IActionResult”类型的第一个参数的扩展方法“StatusCode”(您是否缺少 using 指令或程序集引用?)
我该如何解决这个问题?
解决方案
将响应转换为所需的类型并访问成员以进行断言。
请注意,测试操作返回 a 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);
}
推荐阅读
- c++ - 使变量字符串忽略转义序列
- html - 如何在引导程序中实现表单样式?
- r - 寻找将宽数据转换为长数据的更有效解决方案
- python - 减少在 Pandas (Python) 中填充空数据框单元格的时间
- r - 如何从列表中的所有嵌套列表中修改同一列中的选择行?
- javascript - 如何使用带有链接按钮的 checkValidity?
- sql - SQL Server 查询:Where 条件下的性能问题
- php - Twig 过滤器中的 preg_replace 不接受字符串作为 RegEx
- avro - 具有空对象的记录类型的 Avro 模式
- java - 在 HashMap 值中存储两个值