如何对返回无效值的命令处理程序进行单元测试?

时间:2019-02-15 09:38:50

标签: c# cqrs

请参见下面的代码:

public class CreatePersonHandler
        : IRequestHandler<CreatePersonCommand,Unit>
    {

 public async Task<Unit> Handle(CreatePersonCommand message, CancellationToken cancellationToken)
        {
            var person = _enquiryFactory.Create(message.Gender, message.Salary);
            var offers = getAvailableOffers(); 
            person.AssignOffers(offers);
            await _mediator.DispatchDomainEventsAsync(person);
            return Unit.Value;
        }
  }

注意:

  

1)该命令没有任何状态。
  2)命令方式   没有返回值。

我在这里阅读了一些类似的问题,例如这个:Unit testing void methods?。返回空值的CQRS命令处理程序是否归类为参考信息,不应进行单元测试?

2 个答案:

答案 0 :(得分:1)

从根本上说,测试返回一个void的“命令处理程序”与测试返回一个void的方法没有什么不同-void返回清楚地表明该方法因其副作用而被调用,因此您检查是否存在副作用

根据被测对象的性质,使用test double而不是实时协作者来确定是否发生了正确的事情可能是有道理的。

var person = _enquiryFactory.Create(message.Gender, message.Salary);
var offers = getAvailableOffers(); 
person.AssignOffers(offers);
await _mediator.DispatchDomainEventsAsync(person);
return Unit.Value;

在此示例中要注意的一件事是,不仅您的处理程序中没有 state ,而且还没有 logic -这里的任何分支都被封装了在合作者中。

假设各个部分组合在一起,那么处理程序的责任就不会失败。因此,我不会阻止这样的请求,因为处理程序没有“单元测试”。

  

您能否阐明您的意思是:“假设各部分组合在一起”。我

在“强类型”语言中,编译器/解释器将为我们完成很多检查。如果不满意类型系统,那么在将方法加载到执行环境之前,我们将收到一条错误消息。

答案 1 :(得分:0)

我看到您正在使用.DispatchDomainEventsAsync()添加/引发新事件。您可以返回这些事件并编写一个简单的单元测试来计算这些事件的数量或结构,而不是什么也不返回。