3 回答
TA贡献1797条经验 获得超6个赞
在运行时,由于隐式转换,您的原始测试代码仍然可以工作。
但是根据提供的调试器图像,测试似乎对结果的错误属性进行了断言。
因此,虽然更改被测方法允许测试通过,但无论哪种方式都可以实时运行
ActioResult<TValue> 有两个属性,根据使用它的操作返回的内容进行设置。
/// <summary>
/// Gets the <see cref="ActionResult"/>.
/// </summary>
public ActionResult Result { get; }
/// <summary>
/// Gets the value.
/// </summary>
public TValue Value { get; }
来源
因此,当使用Ok()它返回的控制器操作将ActionResult<int>.Result通过隐式转换设置操作结果的属性。
public static implicit operator ActionResult<TValue>(ActionResult result)
{
return new ActionResult<TValue>(result);
}
但是测试正在断言Value属性(参考 OP 中的图像),在这种情况下没有设置。
无需修改被测代码以满足测试,它可以访问该Result属性并对该值进行断言
[Fact]
public async Task GetLocationsCountAsync_WhenCalled_ReturnsLocationsCount() {
//Arrange
_locationsService
.Setup(_ => _.GetLocationsCountAsync(It.IsAny<string>()))
.ReturnsAsync(10);
var controller = new LocationsController(_locationsService.Object, null) {
ControllerContext = { HttpContext = SetupHttpContext().Object }
};
//Act
var actionResult = await controller.GetLocationsCountAsync();
//Assert
var result = actionResult.Result as OkObjectResult;
result.Should().NotBeNull();
result.Value.Should().Be(10);
VerifyAll();
}
TA贡献1806条经验 获得超5个赞
问题是将其包装在Ok. 如果返回对象本身,Value则填充正确。
如果您查看文档中的Microsoft 示例,他们只会将控制器方法用于非默认响应,例如NotFound:
[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult<Product> GetById(int id)
{
if (!_repository.TryGetProduct(id, out var product))
{
return NotFound();
}
return product;
}
- 3 回答
- 0 关注
- 163 浏览
添加回答
举报