在尝试获取遗留代码库时,我遇到了一个执行以下操作的对象:
class Foo
{
public function __construct($someargs)
{
$this->bar = new Bar();
// [lots more code]
}
}
此实例中的Bar有一个构造函数可以执行一些不良事情,例如:连接到数据库。我正在努力专注于让这个Foo类接受测试,所以把它改成了这样的东西:
class Foo
{
public function __construct($someargs)
{
$this->bar = $this->getBarInstance();
// [lots more code]
}
protected function getBarInstance()
{
return new Bar();
}
}
并尝试通过以下PHPUnit测试来测试它:
class FooTest extends PHPUnit_Framework_TestCase
{
public function testInstance()
{
$bar = $this->getMock('Bar');
$foo = $this->getMock('Foo', array('getBarInstance'));
$foo->expects($this->any())
->method('getBarInstance')
->will($this->returnValue($bar));
}
}
但是这不起作用 - 在我的 - > expected()添加之前调用Foo()的构造函数,因此模拟的getBarInstance()方法返回null。
有没有办法解除这种依赖关系,而不必重构类使用构造函数的方式?
答案 0 :(得分:4)
使用$callOriginalConstructor
的{{1}}参数。将其设置为getMock()
。这是该方法的第五个参数。在这里查找:http://www.phpunit.de/manual/current/en/api.html#api.testcase.tables.api
实际上,坚持下去。你想将模拟传递给模拟?如果你真的想要这个,那么使用false
的第三个参数来表示构造函数的参数。在那里,您可以将getMock
的模拟传递给模拟Bar
。