【发布时间】:2016-06-28 22:23:38
【问题描述】:
我有一个名为TestClass 的类,它有一个名为parent 的属性。 parent 属性与TestClass 的类型相同。
下面显示的是我正在尝试测试的TestClass 的一部分。
class TestClass
{
/**
* @param array $parentIds
* @return ApiLock[]
*/
protected function getParentLocks(array $parentIds)
{
if ($this->getParent()) {
$id = array_pop($parentIds);
return $this->getParent()->getLocks($id, $parentIds);
}
return [];
}
/**
* @param array $ids
* @return ApiLock[]
*/
protected function getLocks($id, array $ids)
{
$locks = $this->getParentLocks($ids);
if ($this->config->getLockName()) {
$locks[] = new ApiLock($this->config->getLockName() . '.' . $id, $this->config->getLockWait());
}
return $locks;
}
}
getLocks 方法调用getParentLocks 方法。为了测试这个类,我模拟了 TestClass 对象并设置为 SUT 的父级。类似的东西。
$apiLock = $this->getMockBuilder(ApiLock::class)
->disableOriginalConstructor()
->getMock();
$parent = $this->getMockBuilder(TestClass::class)
->disableOriginalConstructor()
->getMock();
$parent->expects($this->any())
->method('getLocks')
->will($this->returnValue([$apiLock]));
$testClass->setParent($parent);
但是当我运行测试时,parent 对象上的方法setLocks 不会返回存根值,但实际上会调用父对象上的setLocks 方法并且测试失败。可能是我没有看到明显的东西。
应该调用存根方法而不是父对象上的真实方法。
请帮助我提前谢谢。
【问题讨论】:
-
不确定您使用的是什么模拟/测试框架。但我认为它应该有一个
when()方法,所以 Mock 知道它应该为哪个方法调用返回什么存根数据。正如你所说,你的存根没有被称为或你的 Mock 实际上是一个间谍。
标签: php unit-testing mocking phpunit