我有一个ASP.NET Core WebAPI项目,在测试控制器时遇到了一些麻烦。
在我的控制器中,我将执行以下操作:
[HttpGet]
public async Task<ActionResult<ListUsersDto>> Get()
{
var users = await _userService.GetAllUsers();
return Ok(users);
}
所以我的测试是:
[Test]
public async Task Get_ReturnsAllUsers()
{
var listUsersDto = new ListUsersDto();
listUsersDto.Users.Add(
new UserDto()
{
Id = DEFAULT_TRUCK_ID,
Color = "White",
CreationDate = date,
EditDate = date,
ManufactureYear = date.Year,
ModelYear = date.Year
}
);
_userService.Setup(m => m.GetAll()).ReturnsAsync(listUsersDto);
var controller = GetController();
var response = await controller.Get();
Assert.IsInstanceOf(typeof(OkObjectResult), response.Result);
}
该测试正常通过。但我无法弄清楚如何获得回报的实际价值。
Assert.AreEqual(1, response.Value.Users.Count);
//This test fails because the Value is empty.
Value
的{{1}}属性始终为空。如果调试测试,我可以看到response
返回正确的对象。我在这里想念什么?
答案 0 :(得分:0)
由于该操作已定义为返回ActionResult<ListUsersDto>
,而您返回的是Ok(users)
,因此您所描述的是设计使然。
Value
将为空,因为正在返回操作结果。 ActionResult<T>
返回一个或另一个。两者都不是。
由于Ok(users)
,您需要从返回的操作结果中提取值。
//Act
var response = await controller.Get();
//Assert
OkObjectResult result = Assert.IsInstanceOf<OkObjectResult>(response.Result);
//assert the value within the object result.
ListUsersDto dto = Assert.IsInstanceOf<ListUsersDto>(result.Value);
Assert.AreEqual(1, dto.Users.Count);
事情会有所不同,例如动作定义不同
[HttpGet]
public async Task<ActionResult<ListUsersDto>> Get() {
var users = await _userService.GetAllUsers();
if(users == null || users.Users.Count == 0)
return NoContent(); //Or some other relevant action result
return users;
}
测试就像您最初所做的那样
[Test]
public async Task Get_ReturnsAllUsers() {
//Arrange
var listUsersDto = new ListUsersDto();
listUsersDto.Users.Add(
new UserDto()
{
Id = DEFAULT_TRUCK_ID,
Color = "White",
CreationDate = date,
EditDate = date,
ManufactureYear = date.Year,
ModelYear = date.Year
}
);
_userService.Setup(_ => _.GetAllUsers()).ReturnsAsync(listUsersDto);
var controller = GetController();
//Act
var response = await controller.Get();
//Assert
Assert.AreEqual(1, response.Value.Users.Count);
}
然后,因为该操作直接返回了结果对象,所以将填充ActionResult<ListUsersDto>.Value
属性。