【问题标题】:How to unit test MediatR method that returns Unit.Value如何对返回 Unit.Value 的 MediatR 方法进行单元测试
【发布时间】:2020-11-17 10:29:04
【问题描述】:
如何对返回 Unit.Value 的 MediatR 方法进行单元测试?
在 MediatR 中,我也不明白 Unit.Value 代表什么。
这是否意味着它在错误的情况下返回 false 并在所有其他实例中返回 true?因此,在这种情况下,单元测试的一种方法是确保没有错误(模拟依赖项等),并检查 Unit.Value 形状的结果是否等于 true?
谢谢。
【问题讨论】:
标签:
c#
unit-testing
mediatr
【解决方案1】:
Unit 是具有单个值的类型。您可以将其视为 void,除了是常规类型而不是关键字。
您应该像任何返回 void 的方法一样测试该方法:验证它是否具有所需的副作用。
【解决方案2】:
您可以将Unit 视为void - 不返回任何内容。
(注意:较新版本的 Mediatr 将其包装起来,因此您可以返回 Task)
但出于示例目的,假设您有这样的Handler
public class MyHandler : IRequestHandler<Unit>
{
public MyHandler(IDoSomething doSomething)
{
_doSomething = doSomething;
}
public Task Handle(MyRequest req, CancellationToken cancellationToken)
{
_doSomething.Do();
return Unit.Value;
}
}
您的测试可以模拟您的依赖项,并断言它被调用:
public class MyHandlerTests
{
private Mock<IDoSomething> _doSomethingMock;
[SetUp]
public void SetUp()
{
_doSomethingMock = new Mock<IDoSomething>();
}
[Test]
public async Task Calls_DoSomething()
{
// Arrange
var handler = new MyHandler(_doSomethingMock.Object);
// Act
await handler.Handle(new MyRequest(), CancellationToken.None);
// Assert
_doSomethingMock.Verify(x => x.Do(), Times.Once);
}
}