gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:37:52 26 4
gpt4 key购买 nike

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

在我想测试的命令之一中,我注入(inject) 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 应用程序之外,我可以利用现有的依赖项注入(inject)实现)似乎并不那么简单,坦率地说,我实际上不明白如何在我的测试方法中执行此操作。

我知道我可能可以使用 MediatR 已经提供实现的依赖注入(inject)框架(Ninject 等),但实际上我不想在单元测试中使用除 MediatR 之外的任何其他第三方库,只是为了创建实例。

有没有一种更简单的方法来实例化我可能监督过的 MediatR?

最佳答案

您的或模型处于正确的位置 - 您需要模拟IMediator

有一些模拟库:

  • 起订量
  • FakeItEasy
  • N替补

Moq是最流行的之一,因此,以您的测试为例:

[Fact]
public async void UpdateCustomerCommand_CustomerDataUpdatedOnDatabase()
{
//Arrange
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());

//Assert
//Do the assertion

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

关于cqrs - 如何实例化 Mediatr 作为单元测试的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55443201/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com