Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止PhpStorm显示预期的。。。使用PHPUnit模拟时发出警告?_Php_Unit Testing_Phpunit_Phpstorm_Type Hinting - Fatal编程技术网

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

如何防止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){}

在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);                              
    }                                                
}   
$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应该适应开发用例,而不是软件本身。按照公认答案中的建议,添加内联docblock
TypeA | TypeB
,这是一个不错的选择。