Модульное тестирование контроллера с проблемой AutoMapper - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь проверить контроллер в моем приложении asp.netcore. Тест не пройден из-за автоматического сопоставления. Я пытался издеваться над авто-картографом, но я не знаю, как правильно его использовать. Кто-нибудь сможет предложить способ преодоления этого? Спасибо.

BooksController.cs

[HttpGet("{id:int}")]
public IActionResult GetBook(int id)
{
    var bookfromRepo = _repository.GetBook(id);
    var book = Mapper.Map<BookDto>(bookfromRepo);
    return Ok(book);
}

startup.cs

AutoMapper.Mapper.Initialize(cfg =>
{
    cfg.CreateMap<Data.Database.Entities.Book, BookDto>();
});

ControllerTest.cs

[Fact(DisplayName = "GetBook")]
public void GetBook()
{
    //act
    var fakerepository = new Mock<IBPDRepository>();
    var sut = new BooksController(fakerepository.Object);

    //act
    var book = new BookDto();
    var viewModelBook = new BookDto {
        Id  =    1,
        Name = "C#", 
        Review = "good", 
        Pages = "500",
        Rating = "8",
        Price ="$10.00"
    };

    //var mockMapper = new Mock //stuck here;
    sut.GetBook(1);

    //assert
    IActionResult actionResult = sut.GetBook(2);
    Assert.Equal("C#",viewModelBook.Name);
}

1 Ответ

0 голосов
/ 11 мая 2018

Измените Mapper на IMapper, и тогда вы можете написать что-то подобное для UnitTest: (Я делаю это от руки, поэтому возможны небольшие корректировки)

[Fact(DisplayName = "GetBook")]
public void GetBook()
{
    // Arrange
    var mockBook1 = new Mock<BookDto>(Behavior = MockBehavior.Strict);
    var mockBook2 = new Mock<BookDto>(Behavior = MockBehavior.Strict);
    var mockRepository = new Mock<IBPDRepository>(Behavior = MockBehavior.Strict);
    mockRepository.Setup(r => r.GetBook(It.Is<int>(1)).Returns(mockBook1.Object)
    var mockMapper = new Mock<IAutoMapper>(Behavior = MockBehavior.Strict);
    mockMapper.Setup(m => m.Map<BookDto>(mockBook1.Object)).Returns(mockBook2.Object);

    // You might have to change the constructor.
    var sut = new BooksController(mockRepository.Object, mockMapper.Object);

    IActionResult actionResult;

    // Act
    actionResult = sut.GetBook(1);

    var actualBook = actionResult.Model as BookDto;

    // Assert
    Assert.Equal(mockBook2.Object, actualBook);
}

Причина, по которой я бы использовал mockBook вместо прямой BookDto, заключается в том, что таким образом, в сочетании с поведением Strict , вы знаете, что метод ничего не изменил, так как вы не настроили на нем.

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