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

在 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);                              
    }                                                
}   

在 PhpStorm 上,用警告加下划线$a->foo($mock);$mockExpected InterfaceA, got PHPUnit_Framework_MockObject_MockObject

图像

使用 PHPUnit Mock 时的 PhpStorm 警告

我想这是因为PHPUnit创建了模拟运行时,而PhpStorm无法知道它实际上正在实现接口。


答案 1

我在PhpStorm Type Inference和Mocking Frameworks的Jetbrain博客中找到了这个问题的解决方法。重要部分:

默认情况下,PhpStorm 能够找出模拟对象上的可用方法。但是,它只显示 PHPUnit 的 PHPUnit_Framework_MockObject_MockObject 类的那些。幸运的是,我们可以通过指示PhpStorm从其他类中推断类型信息来解决这个问题,通过使用简单的文档块注释。

因此,为了使警告消失,我们需要添加 /** @var InterfaceA */ (Cudos to Supericy),让 PhpStorm 知道我们的模拟实际上实现了:/** @var InterfaceA|PHPUnit_Framework_MockObject_MockObject */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);                              
    }                                                
} 

这让我烦恼了一段时间,希望它能帮助别人:)

编辑

由于键入的内容非常丑陋,因此您可以通过MOOMOO缩写它,并让PHPStorms自动完成其余的工作:PHPUnit_Framework_MockObject_MockObject

在此输入图像描述


答案 2

我用于此的另一个插件是动态返回类型插件,它允许您以非常动态的方式配置方法的返回类型(示例是从Mocks获得更好的类型信息)。


推荐