MSTest测试接口返回200状态码但result.Value为null是什么原因?
问题原因
你所用的ASP.NET Core Controller 动作方法返回类型为ActionResult<ItemDto>,该类型的赋值逻辑如下:
- 当动作方法直接返回
ItemDto实例时,值会存储在外层ActionResult<ItemDto>的Value属性中 - 当动作方法通过
return Ok(返回值)、return NotFound()等封装方法返回结果时,实际结果会存储在ActionResult<ItemDto>的Result属性中,外层Value属性始终为null
你已经确认返回的result.Result是OkObjectResult类型,所以预期的返回值需要从OkObjectResult的Value属性中获取。
修复方案
将原测试代码的断言部分修改为如下内容即可:
// 校验返回结果类型为OkObjectResult,同时提取结果实例 var okResult = result.Result.Should().BeOfType<OkObjectResult>().Subject; // 对OkObjectResult中存储的业务值做等价断言 okResult.Value.Should().BeEquivalentTo(expected, options => options.ComparingByMembers<ItemDto>());
额外注意
如果你的GetItemById是异步接口,返回类型为Task<ActionResult<ItemDto>>,还需要同步调整测试代码:
- 测试方法返回值从
void修改为async Task - 调用接口时添加
await关键字:
var result = await controller.GetItemById(random.Next());
内容的提问来源于stack exchange,提问作者Jihai
相关产品推荐
相关产品推荐

