[英]How to properly get the result of controller in nunit?
我有一個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.
response
的Value
屬性始終為空。 如果我調試測試,我可以看到await controller.Get();
返回正確的對象。 我在這里錯過了什么?
因為操作被定義為返回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
屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.