【发布时间】:2023-03-24 23:58:01
【问题描述】:
我正在尝试为基于 CQRS/ES 模式的 MVC Core 2.2 应用程序构建一个 xUnit 测试项目。我在 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?
【问题讨论】: