在PHP中跨多个类对对象状态更改进行单元测试


Unit testing an object state change across multiple classes in PHP

场景:我有一个值对象,它通过引用传递给几个对象(在本例中为事件侦听器),并且它的状态在其中一个对象中被修改。在触发事件侦听器之后,会有另一个调用将对象保存到具有新状态的数据存储中。这是通过使事件侦听器不直接与值对象一起工作来解决的。

问题:如何编写回归单元测试来检查保存时值对象是否未被修改?

示例:

public function someControllerAction() {
    $value = new 'stdClass();
    $value->property = 'awesome';
    $value->type = 'test';
    $obj->method($value);
    $otherObj-> methodChangesStateButShouldNot($value); // If this method is bad it will change the state of value
// Value needs to be the same state as when it was created
    $db->save($value);
}

如果你指的是methodChangesStateButShouldNot(),那么我认为你不应该在这里测试它。如果$otherObj不应该改变$value,那么其他object::method的测试必须确保输入和输出相同。在这里测试这意味着创建一个$otherObj的真实实例,而不是一个假的,然后可能会创建更多的上下文,这不是单元测试的重点,是吗?

如果$otherObj::methodChangesState是一个静态方法,你可能敢这么做。只需克隆$value,然后断言$value前后相等。