PHPUnit和接缝

时间:2011-12-20 15:08:18

标签: unit-testing mocking phpunit

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

我以一种将依赖关系打破到数据库类

的方式重新安排了我的课程
db_Class::getMyData($vars);

成了

self::getMyData($vars);

我在我的代码中添加了函数

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

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

例如,在扩展上面类的seam类中并重载该函数:

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

这非常有用,因为我可以随意更改数据。但是,当使用PHPUnit时,您可以使用$ this-> getMock等运行模拟。我是否能够在接缝类中实现这一目标。

我正在寻找一个解决方案,我没有使用依赖注入器,这将是我的另一种选择,根本不是那么糟糕,只想评估两种选择。

Michael C. Feathers表达了以下内容:

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

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

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

由于

3 个答案:

答案 0 :(得分:3)

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

无论如何,为什么这个方法是静态的?受保护,您只能从同一个类或其子类中调用它。你能在这里发布更多的背景吗?你打算如何使用它,你会在哪里测试它?你能把它改成非静态吗?

答案 1 :(得分:0)

答案 2 :(得分:0)

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

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

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