所以我决定调查在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来获取错误,有时我想要一个包含正确数据的数组,有时可能还有其他东西。
由于
答案 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
确实继承了该损坏的代码,因此其测试失败。正是我们想要的!