Hir*_*ter 14 php phpunit unit-testing type-hinting phpstorm
在PHPUnit中模拟一个接口时,PhpStorm在它被用作类型提示函数的参数时会抱怨.
例
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);
}
}
Run Code Online (Sandbox Code Playgroud)
在$a->foo($mock);
PhpStorm强调$mock
警告Expected InterfaceA, got PHPUnit_Framework_MockObject_MockObject
图片
我猜它正在发生,因为PHPUnit创建了一个运行时模拟器,而PhpStorm无法知道它实际上是在实现接口.
Hir*_*ter 21
我在PhpStorm Type Inference和Mocking Frameworks的Jetbrain博客中找到了解决这个问题的方法.重要的部分:
默认情况下,PhpStorm能够确定模拟对象上的可用方法.但是,它仅显示PHPUnit的PHPUnit_Framework_MockObject_MockObject类.幸运的是,我们可以通过使用简单的docblock注释指示PhpStorm从其他类推断类型信息来解决这个问题.
因此,为了使警告消失,我们需要添加 /** @var InterfaceA */
/** @var InterfaceA|PHPUnit_Framework_MockObject_MockObject */
(告诉Supericy)让PhpStorm知道我们的模拟实际实现InterfaceA
:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
这有点困扰我一段时间,希望它有助于某人:)
编辑
因为输入PHPUnit_Framework_MockObject_MockObject
真的很难看,你可以通过缩写来MOOMOO
让PHPStorms自动完成剩下的工作:
归档时间: |
|
查看次数: |
8635 次 |
最近记录: |