2014-08-23 14 views
8

Khi chế nhạo một giao diện trong PHPUnit, PhpStorm than phiền khi nó được sử dụng làm tham số cho một hàm kiểu gợi ý.Làm thế nào để ngăn chặn PhpStorm hiển thị cảnh báo ... Được mong đợi khi sử dụng mock PHPUnit?

Ví dụ

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

On $a->foo($mock); PhpStorm nhấn mạnh $mock với cảnh báo Expected InterfaceA, got PHPUnit_Framework_MockObject_MockObject

ảnh

PhpStorm warning when using PHPUnit Mock

Tôi đoán nó đang xảy ra bởi vì PHPUnit tạo ra một giả thời gian chạy và PhpStorm không thể biết rằng nó thực sự thực hiện giao diện.

Trả lời

13

Tôi đã tìm thấy giải pháp cho vấn đề này trong blog Jetbrain tại PhpStorm Type Inference and Mocking Frameworks. Phần quan trọng:

Theo mặc định, PhpStorm có khả năng tìm ra các phương pháp có sẵn trên đối tượng giả. Tuy nhiên, nó chỉ hiển thị cho lớp PHPUnit_Framework_MockObject_MockObject của PHPUnit. May mắn thay, chúng tôi có thể giải quyết vấn đề này bằng cách hướng dẫn PhpStorm cũng suy ra thông tin loại từ các lớp khác, bằng cách sử dụng nhận xét docblock đơn giản.

Vì vậy, để làm cho các cảnh báo biến mất, chúng ta cần thêm /** @var InterfaceA *//** @var InterfaceA|PHPUnit_Framework_MockObject_MockObject */ (cudos để Supericy) để cho PhpStorm biết giả của chúng tôi thực sự thực hiện 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);        
    }             
} 

này nghe trộm tôi một thời gian, hy vọng nó giúp ai đó :)

Chỉnh sửa

Kể từ PHPUnit_Framework_MockObject_MockObject thực sự xấu xí để gõ, bạn có thể viết tắt nó qua MOOMOO và để PHPStorms tự động hoàn tất làm phần còn lại:

enter image description here

+8

Nếu bạn đang chế giễu phương pháp là tốt, bạn có thể sử dụng '/ ** @ var InterfaceA | PHPUnit_Framework_MockObject_MockObject */', do đó, nó gõ cho cả hai lớp. – Supericy

+0

+1 @Supericy, đối tượng giả cũng thừa hưởng phương thức giao diện Mock Object 'expected()', sẽ mang lại phpStorm để phàn nàn phương thức không tìm thấy nếu bạn bỏ qua chỉ định cả 'InterfaceA' và' \ PHPUnit_Framework_MockObject_MockObject' –

+0

là các công cụ CI như Scrutinizer sẽ đọc các chú thích này và xem xét biến giả của bạn như một vấn đề bởi vì (ví dụ) "Phương thức này chỉ tồn tại trong PHPUnit_Framework_MockObject_MockObject, nhưng không tồn tại trong InterfaceA". Nó sẽ được đánh dấu là một vấn đề và đánh giá mã của bạn sẽ bị ảnh hưởng ...! –

Các vấn đề liên quan