如何将Mediatr实例化为单元测试的一部分?

问题描述 投票:1回答:1

我正在尝试为基于CQRS / ES模式的MVC Core 2.2应用程序构建一个xUnit Test项目。我在MVC应用程序中使用MediatR作为我的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的方法,我可能会监督它?

cqrs mediatr
1个回答
4
投票

你和or a mockup在正确的界限上 - 你需要嘲笑IMediator

那里有几个模拟库:

  • 我的
  • FakeItEasy
  • NSubstitute

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>()));
    }
© www.soinside.com 2019 - 2024. All rights reserved.