【问题标题】:PHPUnit and seamsPHPUnit 和接缝
【发布时间】:2012-01-24 12:52:15
【问题描述】:

所以我决定研究在 PHPUnit 中使用接缝,但我遇到了一个问题

我以打破对数据库类的依赖关系的方式重新安排了我的课程

db_Class::getMyData($vars);

成为

self::getMyData($vars);

我在代码中添加了函数

protected static function getMyData($vars) {
    return db_Class::getMyData($vars);
}

这样做是为了创建一个继承此类并重载 getMyData 函数的类。当我运行我的测试用例时能够改变它。

例如,在继承上述类并重载该函数的接缝类中:

protected static function getMyData($vars) {
    return array('id'=>1, 'name'=>"My Name");
}

这将非常有用,因为我可以随意更改数据。但是,当使用 PHPUnit 时,您可以使用 $this->getMock 和类似方法运行模拟。我能在 seam 类中实现这一点吗?

我正在尝试寻找一个不使用依赖注入器的解决方案,这将是我的另一种选择,一点也不差,只是想评估这两种选择。

Michael C. Feathers 表示接缝如下:

A seam is a place where you can alter behavior in your program without editing in that place.

所以我可能无法了解完整的情况,而且我已经尝试了解了一段时间,但我无法理解它。如果您有任何想法或问题,请发表评论。

我要求的是一种在不同场景中轻松使用模拟的方法。我并不总是想在接缝中返回相同的值,有时我想返回 null 以得到错误,有时我想返回一个包含正确数据的数组,有时可能还有其他东西。

谢谢

【问题讨论】:

    标签: unit-testing mocking phpunit


    【解决方案1】:

    因为调用静态方法时必须直接引用类,所以不能像非静态方法一样覆盖它们。 Static methods make testing difficult. 我不会重复那里写的内容,我强烈建议您点击答案中的链接。

    无论如何,为什么该方法是静态的?受到保护,您只能从同一类或其子类中调用它。你能在这里发布更多的上下文吗?你打算如何使用它,你将在哪里测试它?可以改成非静态的吗?

    【讨论】:

    • 我在下面提供了一个我想要实现的链接
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      这里的想法是,您可以准备 X 的可测试版本,其中只有 getMyData 被覆盖:

      protected static function getMyData($vars) {
          return $some_dummy_data;
      }
      

      您间接通过TestXX 编写测试。 现在让我们假设您更改了原始X 中的某些内容,这会破坏它。 TestX 确实继承了那个损坏的代码,因此它的测试失败了。正是我们想要的!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        • 1970-01-01
        • 2011-03-20
        • 2011-06-14
        • 2011-11-11
        相关资源
        最近更新 更多