【发布时间】:2014-12-25 14:17:40
【问题描述】:
场景:我有一个值对象,它通过引用传递给多个对象(在本例中为事件侦听器),并且其状态在其中一个对象中被修改。触发事件侦听器后,将进行另一个调用,将对象保存到具有新状态的数据存储中。已通过使事件侦听器不直接与值对象一起工作来解决此问题。
问题:如何编写回归单元测试来检查值对象在保存时没有被修改?
例子:
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);
}
【问题讨论】:
-
您更改了 $value 但仍希望它保持不变,这是怎么回事?
-
@markus 抱歉,代码示例具有误导性。
$value不应该改变。它被一种正在改变它的方法使用并导致错误。基本上,如果我对此代码进行单元测试,它应该会失败。 -
那么,
methodChangesStateButShouldNot()? -
也许我不明白这个问题,但我认为你不应该在这里测试这个,如果
$otherObj不应该改变$value然后在另一个对象中测试: :method 必须确保输入和输出是相同的。在这里测试这个意味着创建一个真实的 $otherObj 实例,然后可能会创建更多的上下文,这不是单元测试的重点,对吧。 -
如果 $otherObj::methodChangesState 是一个静态方法,你可能敢于这样做。只需克隆 $value,然后断言 $value 之前和之后相等。
标签: php unit-testing pass-by-reference