Unit testing 接缝和接缝
所以我决定研究在PHPUnit中使用接缝,但我遇到了一个问题 我重新安排了我的类,打破了对数据库类的依赖关系Unit testing 接缝和接缝,unit-testing,mocking,phpunit,Unit Testing,Mocking,Phpunit,所以我决定研究在PHPUnit中使用接缝,但我遇到了一个问题 我重新安排了我的类,打破了对数据库类的依赖关系 db_Class::getMyData($vars); 变成 self::getMyData($vars); 我在代码中添加了函数 protected static function getMyData($vars) { return db_Class::getMyData($vars); } 这样做是为了创建一个继承该类并重载getMyData函数的类。能够在运行测试用例
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和类似工具运行mock。我是否能够在seam类中实现这一点
我正在尝试寻找一种解决方案,在这种解决方案中,我不使用依赖性注入器,这将是我的另一种选择,一点也不坏,只是想评估两种选择
Michael C.Feathers表示接缝如下:
A seam is a place where you can alter behavior in your program without editing in that place.
因此,我可能无法了解全部情况,我已经尝试了解了一段时间,但我无法了解它。如果您有任何想法或问题,请发表评论
我要求的是一种在不同场景中轻松使用mock的方法。我并不总是希望在seam中返回相同的值,有时我希望返回null以获得错误,有时是一个包含正确数据的数组,有时可能是其他的
谢谢因为在调用静态方法时必须直接引用类,所以不能像重写非静态方法那样重写它们。我不想重复上面写的内容,我强烈建议您按照答案中的链接进行操作
无论如何,为什么这个方法是静态的?由于受到保护,您只能从同一类或其子类调用它。你能在这里发布更多的上下文吗?您打算如何使用它,在哪里测试它?你能把它改成非静态的吗?我在这里找到了我问题的答案:
这里的想法是,您可以准备可测试版本的
X
,其中唯一被覆盖的是getMyData
:
protected static function getMyData($vars) {
return $some_dummy_data;
}
您可以通过TestX
间接地为X
编写测试。
现在,让我们假设您在原始
X
中更改了一些会破坏它的内容TestX
确实继承了损坏的代码,因此其测试失败。正是我们想要的 我在下面提供了一个链接,指向我想要实现的目标