2014-08-23 5 views
8

PHPUnit में एक इंटरफ़ेस का मज़ाक उड़ाते समय, PhpStorm शिकायत करता है जब इसे किसी प्रकार-संकेतित फ़ंक्शन के पैरामीटर के रूप में उपयोग किया जाता है।phpStorm को अपेक्षित दिखने से कैसे रोकें ... PHPUnit mocks का उपयोग करते समय चेतावनी?

उदाहरण

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 पर चेतावनी Expected InterfaceA, got PHPUnit_Framework_MockObject_MockObject

छवि

PhpStorm warning when using PHPUnit Mock

साथ $mock को रेखांकित करता है मुझे लगता है कि यह हो रहा है क्योंकि PHPUnit नकली एक रनटाइम बनाता है और PhpStorm नहीं जानता कि यह वास्तव में इंटरफ़ेस को कार्यान्वित कर रहा है।

उत्तर

13

मैं PhpStorm Type Inference and Mocking Frameworks पर Jetbrain ब्लॉग में इस समस्या का एक समाधान मिल गया। महत्वपूर्ण हिस्सा:

डिफ़ॉल्ट रूप से, PhpStorm नकली ऑब्जेक्ट पर उपलब्ध विधियों को समझने में सक्षम है। हालांकि, यह केवल PHPUnit के PHPUnit_Framework_MockObject_MockObject क्लास के लिए प्रदर्शित करता है। सौभाग्य से, हम PhpStorm अन्य वर्गों से टाइप जानकारी का अनुमान लगाने के साथ-साथ, एक सरल docblock टिप्पणी का उपयोग करके निर्देश देते द्वारा इस का समाधान कर सकते हैं।

तो चेतावनी गायब करने के लिए, हम (Supericy को Cudos) /** @var InterfaceA *//** @var InterfaceA|PHPUnit_Framework_MockObject_MockObject */ जोड़ने के लिए 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);        
    }             
} 

यह मैं कुछ समय के लिए bugged, आशा है कि यह मदद करता है किसी को :)

संपादित

PHPUnit_Framework_MockObject_MockObject के बाद से टाइप करने के लिए वास्तव में बदसूरत है, तो आप इसे MOOMOO के माध्यम से संक्षिप्त और दे सकते हैं PHPStorms स्वत: पूर्ण बाकी:

enter image description here

+8

आप तरीकों मजाक कर रहे हैं और साथ ही, आप 'उपयोग कर सकते हैं/** @ var InterfaceA | PHPUnit_Framework_MockObject_MockObject */', इसलिए यह दोनों वर्गों के लिए टाइपशॉट करता है। – Supericy

+0

+1 @Supericy, मज़ाक उड़ाया वस्तु भी विरासत में नकली वस्तु इंटरफ़ेस विधि 'उम्मीद है()', जो वापस phpStorm लाने विधि नहीं पाया जाता है शिकायत करने के लिए देते हैं अगर आप को निर्दिष्ट दोनों 'InterfaceA' और' \ PHPUnit_Framework_MockObject_MockObject' –

+0

बुरी बात पर ध्यान न दें यह है कि स्क्रूटाइज़र जैसे सीआई टूल्स इन एनोटेशन को पढ़ेंगे और आपके मॉक वैरिएबल को एक मुद्दे के रूप में मानेंगे क्योंकि (उदाहरण के लिए) "विधि अपेक्षा केवल PHPUnit_Framework_MockObject_MockObject में मौजूद है, लेकिन इंटरफ़ेस में नहीं है"। इसे एक मुद्दे के रूप में चिह्नित किया जाएगा और आपकी कोड रेटिंग प्रभावित होगी ...! –

संबंधित मुद्दे