【发布时间】:2015-02-03 18:28:45
【问题描述】:
我正在使用PHPUnit 3.6.10(很遗憾,我目前无法升级到新版本)。
在处理一些遗留代码的模拟时,我遇到了一个奇怪的错误。试过google,只出现了与静态方法相关的结果,这不是我的情况。
有这个课程:
class ServicesMapper extends DbMapper
{
//... (some methods)
public function saveTravel(ServiceTravel $oTravel) {
$this->getAdapter()->insert('services_travels', $oTravel->getToArray());
}
//... (some methods)
}
我尝试模拟它:
(内部单元测试类)
/**
* @return ServicesMapper
*/
private function getServicesMapperStub()
{
$stub = $this->getMock('ServicesMapper');
$stub->expects($this->any())
->method('searchBy')
->will($this->returnValue(array()));
return $stub;
}
现在,在运行这个假测试时(我知道这个测试什么都不做,这只是为了显示问题):
/**
* @test
*/
public function fakeMockTest(){
$serviceMapper = $this->getServicesMapperStub();
$this->assertTrue(true);
}
我收到此错误:
Declaration of Mock_ServicesMapper_60b00178::saveTravel()
should be compatible with ServicesMapper::saveTravel(ServiceTravel $oTravel)
我在很多地方都使用了这种模拟方式,除了这种特殊情况外,它都很好用。我的代码有什么问题?
顺便说一句:我也尝试通过模拟 saveTravel 方法来解决这个问题,但没有运气。
【问题讨论】:
-
我不确定你常用的模拟函数在做什么,因为它没有模拟你正在测试的同一个类,但我假设你已经覆盖了“Default_Model_Mapper_Services”。该错误表明您在没有参数的情况下模拟了 saveTravel(),但您的测试(和主类)需要一个 ServiceTravel 类型的参数。
-
嗨!抱歉,我的示例中有错字。我将所有长类名称转换为短名称以使代码更具可读性,但我忘记在一个地方更改它。解决了这个问题,更新了问题。另外 - 不幸的是,
saveTravel()在我测试过的测试或生产代码中的任何地方都没有被使用或模拟。仔细检查。 -
在您的模拟中,我注意到您正在寻找方法('searchBy'),而不是 saveTravel()。这可能不是什么,但它似乎确实没有接听电话然后使用模拟。尽管如此,该错误似乎仍然表明您的模拟(Mock_ServicesMapper_60b00178::saveTravel() 和 ServiceMapper::saveTravel(ServiceTravel $oTravel) 中的差异。看来模拟仍然没有正确定义。
-
我知道它们是两种不同的方法。棘手的部分是,在我所有的测试中,我只使用 searchBy,从不保存旅行。
-
那么不确定。我只能假设错误是准确的,并且正在检查 saveTravel,但模拟结构没有正确引用。
标签: php unit-testing mocking phpunit