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

PHPUnit: how to test commands or functions that modify state?

正在尝试进行单元测试。由于我也在实施 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 );
  }
}

考虑到单元测试是关于测试我的 类 的 public API,我到底想在这里测试什么? Entity 的实例已传递到存储库?

Trying to get into Unit Testing. Since I'm also implementing CQRS, I was wondering how I would test something like this

您想观看的两个演示:

两次谈话的 TL;DR 是:

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

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

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