Как создать Mediatr в рамках модульного теста? - PullRequest
1 голос
/ 31 марта 2019

Я пытаюсь создать тестовый проект xUnit для приложения MVC Core 2.2, основанный на шаблоне CQRS / ES. Я использую MediatR как часть моего шаблона CQRS / ES в приложении MVC.

В одной из моих команд, которые я хотел бы протестировать, я ввожу MediatR для публикации события после обновления записи клиента. Вроде как это:

    public class UpdateCustomerCommandHandler : IRequestHandler<UpdateCustomerCommand>
    {
        public IMediator Mediator { get; set;  }

        public UpdateCustomerCommandHandler(IMediator mediator)
        {
            Mediator = mediator;
        }

        public Task<Unit> Handle(UpdateCustomerCommand request, CancellationToken cancellationToken)
        {
            //do some stuff

            Mediator.Publish(new CustomersChanged());

            return Task.FromResult(new Unit());
        }
    }

При написании модульного теста для этой команды я, очевидно, также должен создать экземпляр MediatR (или макета), который я затем передам команде во время выполнения теста.

        [Fact]
        public async void UpdateCustomerCommand_CustomerDataUpdatedOnDatabase()
        {
            //Arange

            var mediator = new Mediator(); // doesn't work that way..

            UpdateCustomerCommand command = new UpdateCustomerCommand();
            UpdateCustomerCommandHandler handler = new UpdateCustomerCommandHandler(mediator);

            //Act
            Unit x = await handler.Handle(command, new System.Threading.CancellationToken());

            //Asert
            //Do the assertion
        }

Однако создание экземпляра MediatR (вне приложения MVC, где я могу использовать существующую реализацию внедрения зависимостей) кажется не таким простым и, честно говоря, я на самом деле не понимаю, как я могу это сделать в моем методе тестирования.

Я понимаю, что потенциально мог бы использовать инфраструктуру внедрения зависимостей, для которой MediatR уже предоставляет реализацию (Ninject и т. Д.), Но на самом деле я не хочу использовать какие-либо сторонние библиотеки в моих модульных тестах, кроме MediatR, просто ради создания экземпляра.

Есть ли более простой способ создания экземпляра MediatR, который я мог бы наблюдать?

1 Ответ

3 голосов
/ 31 марта 2019

Вы находитесь на правильных линиях с or a mockup - вам нужно макет IMediator

Есть несколько библиотек насмешек:

  • Moq
  • FakeItEasy
  • NSubstiutute

Moq является одним из самых популярных, поэтому, используя ваш тест в качестве примера:

    [Fact]
    public async void UpdateCustomerCommand_CustomerDataUpdatedOnDatabase()
    {
        //Arange
        var mediator = new  Mock<IMediator>();

        UpdateCustomerCommand command = new UpdateCustomerCommand();
        UpdateCustomerCommandHandler handler = new UpdateCustomerCommandHandler(mediator.Object);

        //Act
        Unit x = await handler.Handle(command, new System.Threading.CancellationToken());

        //Asert
        //Do the assertion

        //something like:
        mediator.Verify(x=>x.Publish(It.IsAny<CustomersChanged>()));
    }
...