如何防止PhpStorm在使用PHPUnit模拟时显示预期的...警告?

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 Mock时出现PhpStorm警告

我猜它正在发生,因为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自动完成剩下的工作:

在此输入图像描述

  • 如果你也在模拟方法,你可以使用`/**@var InterfaceA | PHPUnit_Framework_MockObject_MockObject*/`,因此它为两个类提供了类型提示. (9认同)