如何正确获取nunit中控制器的结果?

时间:2019-05-21 19:50:04

标签: c# unit-testing asp.net-core

我有一个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返回正确的对象。我在这里想念什么?

1 个答案:

答案 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属性。