场景:我有一个值对象,它通过引用传递给几个对象(在本例中为事件侦听器),并在其中一个对象中修改其状态。在触发事件侦听器之后,还有另一个调用将对象保存到具有新状态的数据存储。通过使事件侦听器不直接使用值对象来解决此问题。
问题:如何编写回归单元测试以检查在保存发生时是否修改了值对象?
示例:
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);
}
答案 0 :(得分:1)
如果您的意思是methodChangesStateButShouldNot()
,那么我认为您不应该在此进行测试。如果$otherObj
不应该更改$value
那么另一个object::method
中的测试必须确保输入和输出相同。在这里测试这意味着创建一个真实的$otherObj
实例,而不是假的,然后可能更多的上下文,这不是单元测试的重点,是吗。
如果$otherObj::methodChangesState
是一种静态方法,你可能敢于这样做。只需克隆$value
,然后断言$value
之前和之后相等。