【发布时间】:2019-07-29 06:40:38
【问题描述】:
我开始使用 PHPUnit 来测试和模拟 php 中的方法。如果方法在同一个类中,则没有问题。
但我还不明白如何模拟另一个类中的方法。
class classA {
public function funcA() {
$classB = new classB();
$value = $classB->getValue();
return $value;
}
}
class classB {
public function getValue() {
return "this is my value";
}
}
如果 getValue 属于 A 类,我可以执行以下操作:
class testClassA {
function testFuncA() {
$mb = $this
->getMockBuilder(classA::class)
->setMethods(array('getValue'))
->getMock();
$mb
->method('getValue')
->will($this->returnValue('my new value');
$value = $mb->funcA();
$this->assertEquals('my new value', $value);
}
}
但是在我们上面的情况下,我该怎么做呢?
编辑:
Jon Stirling 要求在构造函数而不是测试方法中实例化 classB
所以让我们编辑classA
class classA {
$private classB;
public function __construct(){
$this->classB = new classB();
}
public function funcA() {
$value = $this->classB->getValue();
return $value
}
}
那怎么可能呢?
【问题讨论】:
-
理想情况下,您会将 classB 的实例注入到 classA 中(通过构造函数、setter 或作为 funcA 的方法 arg),但是由于您在要测试的方法中实例化 classB,因此您已经很难模拟(我想你可以操纵自动加载器)。
-
感谢您的评论。我现在编辑了帖子。你有什么想法,我现在应该怎么做?
-
这根本不是我说的。我说它应该注入对象。你所做的只是移动你在同一个类中实例化它的位置。
-
好吧,我误解了..但我认为在我的情况下这是不可能的..
-
您的
testFuncA测试实际上并没有测试任何东西。它模拟出一个方法并测试模拟出的方法返回假数据。它实际上并没有运行您的任何代码。