Как правильно получить результат работы контроллера в nunit? - PullRequest
0 голосов
/ 21 мая 2019

У меня есть проект 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 response всегда пусто.Если я отлаживаю тест, я вижу, что await controller.Get(); возвращает правильный объект.Что мне здесь не хватает?

1 Ответ

0 голосов
/ 22 мая 2019

Поскольку определено, что действие возвращает 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 будет заполнено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...