如何在单元测试中实例化Mediatr?

时间:2019-03-31 16:53:12

标签: cqrs mediatr

我正在尝试为基于CQRS / ES模式的MVC Core 2.2应用程序构建xUnit Test项目。我将MediatR用作MVC应用程序中CQRS / ES模式的一部分。

在我要测试的命令之一中,一旦客户记录已更新,我将注入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之外的任何其他第三方库,只是为了创建实例。

有没有一种更简单的实例化MediatR的方法,我可能已经对此进行了监督?

1 个答案:

答案 0 :(得分:2)

您在or a mockup的右边,-您需要模拟 IMediator

那里有一些模拟库:

  • 起订量
  • 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>()));
    }