试图进入单元测试。由于我也在实现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
的实例传递到存储库?
答案 0 :(得分:1)
试图进入单元测试。由于我也正在实施CQRS,所以我想知道如何测试这样的东西
您要观看的两个演示文稿:
两个对话的TL; DR为:。
通过查询测试对象的状态来断言发送到测试对象的查询消息和命令消息。测试对象通过 发送的命令消息已通过预期验证-您确认发送了正确的消息,而不必担心该消息的影响。
因此,您问题的答案部分取决于在此测试中,存储库是受测系统的一部分,还是the boundary的一部分。如果存储库是被测系统的一部分,那么您可以将整个测试视为对传入消息的验证,并查询存储库的状态。如果存储库是边界的一部分(如果测试提供),那么您可以测试期望值–存储库上的方法是否正确调用了?
在后一种情况下,还有一个有趣的问题:是否需要验证期望代码的味道?测试可能是通过引发对预期的检查而实际上揭示了设计中的问题。也许命令处理程序本身中应该包含更多的 instrumentation ,以便测试可以查询命令处理程序本身以查找已发送的消息。 Scott Bellware的Doctrine of Useful Objects探索了这个想法。