#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. Я заметил, что я не настроил макет поведения для всех методов в действиях удаления. Я попробовал ваше предложение, и оно сработало.