【发布时间】:2020-08-18 19:01:57
【问题描述】:
我们的单元测试中有很多重复设置,因为我们使用的是 MediatR 库。我们经常有这样的行:
mockMediator.Setup(m => m.Send(It.IsAny<Command>(), It.IsAny<CancellationToken>())
.ReturnsAsync("ok");
我想做一个扩展方法来简化语法以更加强调Command,如果我们愿意的话,仍然可以让我们有条件,比如:
mockMediator.SetupSend(It.IsAny<Command>())
.ReturnsAsync("ok");
// or
mockMediator.SetupSend(It.Is<Command>(c => c.IsSomething))
.ReturnsAsync("ok");
此代码构建,但它不起作用(模拟始终返回 null):
public static ISetup<IMediator, Task<TResult>> SetupRequest<TResult>(this Mock<IMediator> mockMediator, IRequest<TResult> request) {
return mockMediator.Setup(m => m.Send(request, It.IsAny<CancellationToken>()));
}
从根本上说:如何将参数传递给稍后进入表达式主体的方法?是否有一种受支持的方法可以为常用设置制作像这样的起订量“助手”功能?
【问题讨论】:
-
这可能是您的请求不具有可比性,如果您在单元测试中模拟一个请求,然后在您的测试代码中创建一个新请求,那么您将无法获得设置的引用匹配在寻找。但我们需要查看更多代码以确定是否发生了这种情况。
-
不要模拟 mediatr - 它是纯 c# 代码,没有外部依赖项,不需要模拟。模拟仅适用于外部资源
标签: c# unit-testing moq linq-expressions mediatr