Как имитировать методы репозитория в сервисе для модульного тестирования

#c# #unit-testing

#c# #модульное тестирование

Вопрос:

Я пытаюсь создать модульный тест для своего сервиса, я высмеял все необходимое, как я могу имитировать методы репозитория, которые вызывает сервис, чтобы они имели ценность, а код не нарушался,

Это мой модульный тест:

   public async Task Updateuser_ReturnsResponse()
    {
        // Arrange
        var request = new UpdateUserRequest()
        {
            Guid = new Guid("92296ac1-f8e1-489a-a312-6ea9d31d60f8"),
            FirstName = "TestFirst",
            LastName = "TestLast",
            PhoneWork = "9495467845",
            EmailWork = "test123@yahoo.com",
        };

        var respose = new UpdateUserResponse()
        {
            Success = true
        };

        var getGuidRequest = new GetGuidRequest()
        {
            Guid = request.Guid
        };

        var getGuidResponse = new GetGuidResponse()
        {
            Guid = request.Guid
        };

        var mockUserRepository = new Mock<IUserRepository>();
        var mockAwsProxy = new Mock<IAwsProxy>();

        mockUserRepository.Setup(s => s.UpdateUserAsync(request)).ReturnsAsync(respose);
        mockUserRepository.Setup(i => i.GetGuidAsync(getGuidRequest)).ReturnsAsync(getGuidResponse);
        var sut = new FromService.UserService(....);
        // Act
        var response = await sut.UpdateUserAsync(request);
        // Assert
        Assert.NotNull(response);
        Assert.True(response.Success);
    }
  

Моя проблема заключается в том, что при вызове — var response = await sut .UpdateUserAsync(запрос); Он отправляется в сервис, и этот GuidResponse пуст, поэтому он прерывается после того, как показывает GuidResponse Null:

     public async Task<UpdateUserResponse> UpdateUserAsync(UpdateUserRequest request)
    {
        if (request.EmailWork.HasValue() || request.Role.HasValue())
        {
            var GuidResponse = await userRepository.GetGuidAsync(new GetGuidRequest
            {
                Guid = request.Guid
            });
            // it breaks here because GuidResponse is Null.
            if (GuidResponse.Guid != null amp;amp; request.EmailWork.HasValue())
            {
            .......
  

Ответ №1:

Сбой происходит из-за того, что настройка не соответствует тому, что было фактически задано макету при выполнении теста.

Используется It.Is<T>() для сопоставления переданного параметра аргумента

 //...omitted for brevity

mockUserRepository
    .Setup(_ => _.GetGuidAsync(It.Is<GetGuidRequest>(x => x.Guid == request.Guid)))
    .ReturnsAsync(getGuidResponse);

//...omitted for brevity
  

предполагая, что макет репозитория — это то, что было введено в SUT

Ссылка на быстрый запуск Moq: сопоставление аргументов