Что мне нужно для модульного тестирования этой строки кода с использованием AutoMapper? - PullRequest
0 голосов
/ 24 марта 2020

Я никогда раньше не использовал AutoMapper, поэтому мне интересно, какие юнит-тесты мне нужно написать для этой конкретной строки кода c:

IEnumerable<UserDetail> userDetails = 
    this.mapper.Map<IEnumerable<Entities.User>, IEnumerable<UserDetail>>(users);

соответствующая строка в этом Метод:

public IEnumerable<UserDetail> GetUserDetails()
{
    var users = this.userData.GetUsers();

    //question is about testing this line
    IEnumerable<UserDetail> userDetails = 
        this.mapper.Map<IEnumerable<Entities.User>, IEnumerable<UserDetail>>(users);

    return userDetails;
}

. В настоящее время модульный тест предоставляет фиктивный список пользователей для возврата из this.userData.GetUsers(), а затем проверяет, вывод userDetails содержит те же данные в this.userData.GetUsers()

Эти первые юнит-тесты выглядят так:

[Test]
public async Task VerifyAutoMapperProfile()
{
    //Assert
    this.MapperConfig.AssertConfigurationIsValid();
}

[Test]
public async Task UserService_GetUsers_Returns_IEnumerableUserDetails()
{
    //Arrange
    IList<Entities.User> usersFromData = this.GetMockUsers();

    Mock<IUserDataAccess> mockUserData = new Mock<IUserDataAccess>();

    mockUserData
        .Setup(d => d.GetUsers())
        .Returns(usersFromData);

    //this loads the same AutoMapper.Profile that the application uses
    IMapper mapper = this.MapperConfig.CreateMapper();

    var userService = new UserService(mockUserData.Object, mapper);

    //Act
    var userDetails = userService.GetUserDetails();

    //Assert
    userDetails.Should().BeAssignableTo<IEnumerable<UserDetail>>();
    userDetails.Should().HaveCount(usersFromData.Count);
    userDetails.Should().NotContainNulls();
    userDetails.Should().OnlyHaveUniqueItems();
    userDetails.Should().AllBeOfType<UserDetail>();

    foreach (Entities.User user in usersFromData)
    {
        var userDetail = new UserDetail {FullName = user.FullName, Guid = user.Guid};
        userDetails.Should().ContainEquivalentOf(userDetail);
    }
}

Итак, вопрос в том, должен ли я добавить какое-либо покрытие в этом тесте для указанной мной строки или я должен создавать отдельные тесты для этой строки? (Я буду создавать больше юнит-тестов для этого метода в целом - но мой вопрос специально задает вопрос о методе IMapper.Map. Нужно ли мне покрывать ошибки / исключения, генерируемые этим методом? Достаточно ли просто иметь this.MapperConfig.AssertConfigurationIsValid()

1 Ответ

0 голосов
/ 24 марта 2020

В вашем методе GetUserDetails () вы делаете 2 вещи. Первый загружает пользователей, второй конвертирует. Таким образом, в основном, ваш модульный тест просто необходимо проверить эти 2 вещи. Сначала вызывается GetUsers () или нет? Второй Map () вызывается или нет? И еще одна вещь, если вы загружаете 10 пользователей, вы ожидаете получить обратно 10 пользователей (НЕ проверяйте свойства пользователя).

ПОЧЕМУ вам не нужно проверять свойства пользователя? Так как логика сопоставления c не в вашем методе, вам не нужно это тестировать модулем.

...