Получение исключения с Moq при попытке протестировать задачу - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь использовать Moq (4.10) для асинхронных вызовов, но не могу понять, как это работает.

Узнайте, как это сделать, и нашли ответы, которые я пробовал, но не могу заставить их работать.

Это мой тест

 public class Test
 {
        [Fact]
        public void Test_Create()
        {
            var repositoryMock = new Mock<IRepository>();

            repositoryMock
             .Setup(repo => repo.CreateAsync(It.IsAny<Aggregate >()))
             .Returns(Task.CompletedTask); 
/// also tried this 
/// => .Returns(Task.FromResult(default(object))) 
/// and 
/// => .Returns(Task.FromResult(false))); 

            var useCase = new CreateUseCase(repositoryMock.Object);

            Task.Run(async () => { await useCase.HandleAsync(new CreateRequest()); });

            repositoryMock.VerifyAll();
        }
}

ресурсов

Как я могу сказать Moq вернуть задание?

Получение этого исключения

Moq.MockException: 'Следующие настройки на макете «Mock <.Repository.IRepository: 00000001>» не найдено: IRepository repo => repo.CreateAsync (It.IsAny ())

Репо выглядит так

public interface IRepository 
{
    Task CreateAsync(Aggregate aggregate);
}

UseCase

    public class CreateUseCase : IUseCaseHandler<CreatRequest>
    {

        private IRepository _repository;


        public CreateUseCase (IRepository repository)
        {
            _repository= repository?? throw new System.ArgumentNullException(nameof(repository));
        }


         public async Task HandleAsync(CreateRequest request, CancellationToken? cancellationToken = null)
         {
              Aggregate aggregate = new Aggregate();
                        aggregate.Create();
              await _repository.CreateAsync(aggregate);
          } 
     }

Репозиторий

 public sealed class OrderRepository : ProxyRepository<OrderAggregate>, IOrderRepository
    {
        public OrderRepository(IUnitOfWork unitOfWork, INotificationDispatcher eventHandler) 
            : base(unitOfWork, eventHandler)
        {
        }

        async Task IRepository.CreateAsync(Aggregate aggregate)
        {
            await base.AddAsync(aggregate); 
        }
    }

Что я делаю неправильно или отсутствует?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Я не думаю, что ваша проблема с настройкой Moq вообще. Проблема в том, что модульный тест запускает значимый код, используя Task.Run(), который порождает новый поток. Затем, вернувшись к исходному потоку, вы сразу же проверите, была ли выполнена настройка Moq. Поскольку тестируемый код запускается в другом потоке, существует реальная вероятность того, что проверка на успешность выполняется до выполнения тестируемого кода.

Вы должны изменить свой юнит-тест, чтобы запускать метод теста, используя async & await, а не раскручивать новый поток. Обратите внимание, что подпись тестового примера изменяется с void на async Task, и мы await код, который мы тестируем.

public class Test
{
    [Fact]
    public async Task Test_Create()
    {
        var repositoryMock = new Mock<IRepository>();

        repositoryMock
             .Setup(repo => repo.CreateAsync(It.IsAny<Aggregate >()))
             .Returns(Task.CompletedTask); 

        var useCase = new CreateUseCase(repositoryMock.Object);

        await useCase.HandleAsync(new CreateRequest());

        repositoryMock.VerifyAll();
    }
}
0 голосов
/ 06 ноября 2018

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

public class CreateUseCaseTests
{
    [Fact]
    public async Task HandleAsync_ShouldCreateRequest()
    {
        // Arrange
        var repositoryMock = new Mock<IRepository>();    
        var sut = new CreateUseCase(repositoryMock.Object);

        // Act
        await sut.HandleAsync(new CreateRequest());

        // Assert
        repositoryMock.Verify(x => x.CreateAsync(It.IsAny<Aggregate>()), Times.Once);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...