2010-07-14 5 views
33
मेरी कोड में कभी कभी

, मैं एक विशेष वस्तु एक अंतरफलक को लागू करता है, तो देखने के लिए जाँच होगी:PHPUnit, मज़ाक उड़ाया इंटरफेस, और instanceof

if ($instance instanceof Interface) {}; 

हालांकि, PHPUnit में कहा इंटरफ़ेस का mocks बनाने, मैं नहीं कर सकता प्रतीत होता है कि परीक्षा उत्तीर्ण हो रही है।

// class name is Mock_Interface_431469d7, does not pass above check 
$instance = $this->getMock('Interface'); 

मैं समझता हूँ कि एक वर्ग नामित इंटरफ़ेस होने एक वर्ग इंटरफ़ेस को लागू करने से अलग है, लेकिन मुझे यकीन है कि कैसे इस के साथ सौदा पाने के लिए नहीं कर रहा हूँ।

क्या मुझे इंटरफ़ेस लागू करने वाली ठोस कक्षा का नकल करने के लिए मजबूर होना पड़ा? क्या पोर्टेबिलिटी के लिए इंटरफ़ेस का उपयोग करने के उद्देश्य को नुकसान नहीं पहुंचाएगा?

धन्यवाद

उत्तर

38

यह मेरे लिए काम करता है:

$mock = $this->getMock('TestInterface'); 
$this->assertTrue($mock instanceof TestInterface); 

शायद यह लिखने में कोई त्रुटि या हो सकता है $ उदाहरण क्या आपको नहीं लगता है कि यह है है?

+12

हाँ, कूलर सिर प्रबल। पूरी नींद की रात के बाद, मुझे एहसास हुआ कि ऑब्जेक्ट का मज़ाक उड़ाते समय मैं पूरी तरह योग्य नामस्थान का उपयोग नहीं कर रहा था। –

+0

थोड़ा अलग उपयोग केस, लेकिन क्या मैं जांच सकता हूं कि एक उदाहरण कक्षा के एक वर्ग या कक्षा का एक उदाहरण है। – kapad

+0

@ कपाड आप देखते हैं, यह पॉलिमॉर्फिज्म का मुख्य बिंदु है कि आपको यह पता नहीं होना चाहिए कि वर्तमान वस्तु क्या है या वर्ग या नकली का उदाहरण है। अगर आपको अभी भी पता होना चाहिए, तो आप कुछ गलत करते हैं। पीएस बस FYI आप ऑब्जेक्ट – dVaffection

47

वहाँ भी की 3.5.0

उदाहरण के रूप में assertInstanceOf है:

$this->assertInstanceOf('\Models\User', $this->userService->findById(1)); 
+2

_This_ टाइपिंग प्रकार की अनुशंसा की जाती है। – stefgosselin

+1

@stefgosselin उत्तर के अतिरिक्त, यह टाइपिंग जांचने की अनुशंसित तरीका है, क्योंकि आप बेहतर, स्वयं त्रुटि संदेश समझाते हैं। '' 'की तुलना में असफल रहा है कि ऑब्जेक्ट क्लास' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' –

+2

PHP 5.5 के रूप में आप '\ मॉडल \ उपयोगकर्ता 'के बजाय' \ मॉडल \ उपयोगकर्ता :: वर्ग' का उपयोग कर सकते हैं, जो इसे रीफैक्टरिंग करने में बहुत आसान बनाता है। –