Модульный тест для контроллера API в ASP.NET Ядро 3.1 возвращает неправильный код состояния

#c# #unit-testing #asp.net-core #asp.net-web-api

#c# #модульное тестирование #asp.net-ядро #asp.net-web-api

Вопрос:

Я пишу модульный тест для контроллера API, выполняющего действие удаления. Вот действие удаления

 public IActionResult DeleteSubGenre(Guid subGenreId)
{
    if (!_genreRepo.SubGenreExist(subGenreId))
    {
        return NotFound();
    }

    var genreObj = _genreRepo.SubGenre(subGenreId);

    if (!_genreRepo.DeleteSubGenre(genreObj))
    {
        ModelState.AddModelError("", $"Something went wrong when deleting the record {genreObj.Name}");
        return StatusCode(500, ModelState);
    }
    return NoContent();
}
 

Модульный тест для этого действия записывается как

 [Fact]
public void DeleteSubGenre_Returns_NoContentResult()
{
    // Arrange
    var subGenreRepositoryMock = new Mock<ISubGenreRepository>();
    var subGenreIMapperMock = new MapperConfiguration(config =>
    {
        config.AddProfile(new MovieMapper());
    });
    var subGenreMapper = subGenreIMapperMock.CreateMapper();
    SubGenresController subGenreApiController = new SubGenresController(subGenreRepositoryMock.Object, mapper: subGenreMapper);
    var subGenreDto = new SubGenreDTO()
    {
        Name = "Adult Content",
        DateCreated = DateTime.Parse("15 May 2015"),
        Id = Guid.NewGuid(),
        GenreId = Guid.NewGuid(),
        Genres = new GenreDTO()
    };
    
    // Act
    var subGenreResult = subGenreApiController.DeleteSubGenre(subGenreDto.Id);
    var noContentResult = subGenreResult as NoContentResu<

    // Assert
    Assert.False(noContentResult.StatusCode is StatusCodes.Status204NoContent);
}
 

Во время отладки теста я заметил, что subGenreResult он возвращает код состояния 404 вместо 204. Кажется, я могу зациклиться на этом. Я буду рад получить правдоподобное решение этой проблемы.

Комментарии:

1. Похоже, вы забыли издеваться _genRepo SubGenreExist над методом.

Ответ №1:

Вы должны настроить свой макет, чтобы управлять выполнением вашего тестового примера.

Например, если вы хотите пройти через эту строку: if (!_genreRepo.SubGenreExist(subGenreId))

затем вам необходимо настроить следующее макет поведения:

 subGenreRepositoryMock.Setup(repo => repo.SubGenreExist(It.IsAny<Guid>)).Returns(true);
 

Чтобы добраться до этой строки: return NoContent(); возможно, вам также потребуется настроить два других метода для запуска вашего тестового примера.

Комментарии:

1. Я заметил, что я не настроил макет поведения для всех методов в действиях удаления. Я попробовал ваше предложение, и оно сработало.