我有以下设置:我用PHPUnit模拟非抽象类,但不是所有的方法。因此,非模拟方法仍然存在于模拟中对实际方法的调用。
问题是:如何提示这些方法是否可用(当然,有正确的签名)?
我会详细说明一下。课程样本:
class RealClass
{
public function callApi(Api $api) {}
public function doStuff(Foo $foo, Bar $bar) {}
}
现在我参加了测试:
/** @var \PHPUnit_Framework_MockObject_MockObject $mock */
$mock = $this->getMock('\RealClass', ['callApi']);
这将仅为callApi()
创建模拟,但如果在测试中我做了:
$mock->doStuff($foo, $bar);
我的PHPStorm显然无法找到该方法并假设这是一个错误。我如何指出doStuff()
方法存在并需要适当的参数?
@method
似乎只在类定义中起作用。我尝试用@see
玩一下,但无法解决问题。此外,理想的解决方案是允许在return语句中指定提示的解决方案,因为我可能希望从测试助手方法返回模拟。
“廉价作弊”是暗示与原始类,但我不想做,从那时起我将失去重点 - 这是模拟,而不是。这尤其重要,因为我正在使用帮助器来构建注入模拟的复杂实体。
答案 0 :(得分:3)
您应该将模拟提示为MockObject
或RealClass
的实例,以便您获得类似的内容:
/** @var \RealClass|\PHPUnit_Framework_MockObject_MockObject $mock */
$mock = $this->getMock('\RealClass', ['callApi']);
现在您告诉PhpStorm $mock
可以是PHPUnit MockObject
或 RealClass
实例,它将接受/自动完成方法无论是上课。
另外(这只是一条友好的建议而且根本不需要),你可以使用use
关键字将类导入到测试类中,这样你的提示就会变得更具可读性: / p>
<?php
use \RealClass;
use \PHPUnit_Framework_MockObject_MockObject as MockObject;
class YourTestClass
{
public function yourTest()
{
// Because of the use statements (and the "as" alias rule) you can now:
/** @var RealClass|MockObject $mock */
$mock = $this->getMock('RealClass', ['callApi']);
}
}