PHPUnit:如何测试修改状态的命令或函数?

时间:2018-11-12 12:47:28

标签: php unit-testing cqrs

试图进入单元测试。由于我也在实现CQRS,所以我想知道如何测试这样的东西:

class CommandHandler{
  private $repository;
  public function __construct( $repository ){
    $this->repository = $repository;
  }
  public function handle( $command ) {
    $Entity = new Entity( $command->getSomething() );
    $this->repository->add( $Entity );
  }
}

因为单元测试是关于测试我的类的公共API,我到底想在这里测试什么?是否将Entity的实例传递到存储库?

1 个答案:

答案 0 :(得分:1)

  

试图进入单元测试。由于我也正在实施CQRS,所以我想知道如何测试这样的东西

您要观看的两个演示文稿:

两个对话的TL; DR为:an origin vs type matrix

通过查询测试对象的状态来断言

发送到测试对象的查询消息和命令消息。测试对象通过 发送的命令消息已通过预期验证-您确认发送了正确的消息,而不必担心该消息的影响。

因此,您问题的答案部分取决于在此测试中,存储库是受测系统的一部分,还是the boundary的一部分。如果存储库是被测系统的一部分,那么您可以将整个测试视为对传入消息的验证,并查询存储库的状态。如果存储库是边界的一部分(如果测试提供),那么您可以测试期望值–存储库上的方法是否正确调用了?

在后一种情况下,还有一个有趣的问题:是否需要验证期望代码的味道?测试可能是通过引发对预期的检查而实际上揭示了设计中的问题。也许命令处理程序本身中应该包含更多的 instrumentation ,以便测试可以查询命令处理程序本身以查找已发送的消息。 Scott Bellware的Doctrine of Useful Objects探索了这个想法。