场景:我有一个值对象,它通过引用传递给几个对象(在本例中为事件侦听器),并且它的状态在其中一个对象中被修改。在触发事件侦听器之后,会有另一个调用将对象保存到具有新状态的数据存储中。这是通过使事件侦听器不直接与值对象一起工作来解决的。
问题:如何编写回归单元测试来检查保存时值对象是否未被修改?
示例:
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
前后相等。