如何防止PhpStorm显示预期的。。。使用PHPUnit模拟时发出警告?
在PHPUnit中模拟接口时,PhpStorm会抱怨它被用作类型提示函数的参数 示例如何防止PhpStorm显示预期的。。。使用PHPUnit模拟时发出警告?,php,unit-testing,phpunit,phpstorm,type-hinting,Php,Unit Testing,Phpunit,Phpstorm,Type Hinting,在PHPUnit中模拟接口时,PhpStorm会抱怨它被用作类型提示函数的参数 示例 interface InterfaceA{ } class ClassA{ public function foo(InterfaceA $foo){}
interface InterfaceA{
}
class ClassA{
public function foo(InterfaceA $foo){}
}
class PhpStormTest extends PHPUnit_Framework_TestCase
{
public function testFoo(){
$mock = $this->getMock("InterfaceA");
$a = new ClassA();
$a->foo($mock);
}
}
在$a->foo($mock)上
PhpStorm下划线$mock
带有警告预期接口a,得到PHPUnit\u框架\u MockObject\u MockObject
图像
interface InterfaceA{
}
class ClassA{
public function foo(InterfaceA $foo){}
}
class PhpStormTest extends PHPUnit_Framework_TestCase
{
public function testFoo(){
$mock = $this->getMock("InterfaceA");
$a = new ClassA();
$a->foo($mock);
}
}
我猜这是因为PHPUnit创建了模拟运行时,而PhpStorm无法知道它实际上正在实现接口 我在Jetbrain的博客上找到了解决这个问题的方法。重要的部分是: 默认情况下,PhpStorm能够找出可用的方法 在模拟对象上。但是,它只显示PHPUnit的 PHPUnit_框架_MockObject_MockObject类。幸运的是,我们可以 通过指示PhpStorm从中推断类型信息来解决此问题 通过使用简单的docblock注释,也可以使用其他类 因此,为了使警告消失,我们需要添加
/**var interfaceea*/
/**var interfaceea | PHPUnit_Framework_MockObject_MockObject*/
(cudos to superience),让PhpStorm知道我们的mock实际实现了interfaceea
:
interface InterfaceA{
}
class ClassA{
public function foo(InterfaceA $foo){}
}
class PhpStormTest extends PHPUnit_Framework_TestCase
{
public function testFoo(){
/** @var InterfaceA|PHPUnit_Framework_MockObject_MockObject */
$mock = $this->getMock("InterfaceA");
$a = new ClassA();
$a->foo($mock);
}
}
这个问题困扰了我一段时间,希望它能帮助别人:)
编辑
由于PHPUnit\u Framework\u MockObject\u MockObject
的类型非常难看,因此您可以通过将其缩写,并让PHPStorms自动完成其余操作:
另一种不太详细但可能更危险的方法是使用自己的函数包装对
getMock()
的调用,并用@return mixed
标记该调用:
/**
*
* @return mixed
*/
public function myGetMock($str)
{
return $this->getMock($str);
}
调用此方法而不是
$this->getMock()
将使警告消失。我用于此的另一个插件是,它允许您以非常动态的方式配置方法的返回类型(示例是从mock中获得更好的类型信息)。如果您也在模拟方法,您可以使用/**@var InterfaceA | PHPUnit_Framework\u MockObject\u MockObject*/
,因此它为两个类都键入提示。+1@superience,模拟对象还继承模拟对象接口方法expects()
,如果忽略了指定< <代码>接口> <代码>和<代码> \pPuthITIGraseWorksMoCKObjutsMoCKObjs<代码>坏处,就是像Scrutinizer这样的CI工具将读取这些注释,并将您的模拟变量视为问题,因为(例如)“该方法只存在于PHPUnit_Framework_MockObject_MockObject中,而不存在于InterfaceA中“。它将被标记为问题,您的代码评级将受到影响!phpstorm IMHO为软件引入新接口以使IDE满意的文档是完全错误的。IDE应该适应开发用例,而不是软件本身。按照公认答案中的建议,添加内联docblockTypeA | TypeB
,这是一个不错的选择。