模拟课程:暗示

时间:2015-09-22 07:53:01

标签: mocking phpunit phpstorm phpdoc

我有以下设置:我用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语句中指定提示的解决方案,因为我可能希望从测试助手方法返回模拟。

“廉价作弊”是暗示与原始类,但我不想做,从那时起我将失去重点 - 这是模拟,而不是。这尤其重要,因为我正在使用帮助器来构建注入模拟的复杂实体。

1 个答案:

答案 0 :(得分:3)

您应该将模拟提示为MockObjectRealClass的实例,以便您获得类似的内容:

/** @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']);
    }
}