【问题标题】:Unit testing an object state change across multiple classes in PHP在 PHP 中跨多个类对对象状态更改进行单元测试
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    相关资源
    最近更新 更多