2013-10-20 11 views
7
का उपयोग कर PHP में इंटरफेस मजाक

मैं जब (PHP में मजाक का उपयोग कर laravel ढांचे का उपयोग कर im इंटरफेस मजाक किसी समस्या का सामना किया है, लेकिन मुझे यकीन है कि यह प्रासंगिक है नहीं कर रहा हूँ।त्रुटि जब मजाक

मैं एक अंतरफलक

परिभाषित किया है
<?php namespace MyNamespace\SomeSubFolder; 

interface MyInterface { 

    public function method1(); 

} 

और मैं एक वर्ग है कि तरीकों में से एक पर है कि इंटरफ़ेस typehints है ...

<?php namespace MyNamespace\SomeSubFolder; 

use MyNamespace\SomeSubFolder\MyInterface; 

class MyClass { 

    public function execute(MyInterface $interface) 
    { 
     //does some stuff here 

    } 
} 

... और मुझे MyClass परीक्षण करने के लिए कोशिश कर रहा हूँ। मैं एक परीक्षण है कि शौचालय बनाया है इस तरह ks कुछ: तर्क 1 MyClass के लिए पारित :: निष्पादित MyNamespace \ SomeSubFolder \ MyInterface का एक उदाहरण होना चाहिए, Mockery_123465456 का उदाहरण:

public function testExecute() 
{ 

    $mock = Mockery::mock('MyNamespace\SomeSubFolder\MyInterface'); 

    $mock->shouldReceive('method1') 
     ->andReturn('foo'); 

    $myClass = new MyClass(); 

    $myClass->execute($mock); 

} 

जब मैं परीक्षण चलाने मैं संदेश

'ErrorException प्राप्त दिया .... '

मुझे नहीं पता कि क्यों।

परीक्षण मैं निम्नलिखित की कोशिश की है के भीतर:

$this->assertTrue(interface_exists('MyNamespace\SomeSubFolder\MyInterface')); 

$this->assertTrue($mock instanceof MyInterface); 

और दोनों सच लौटने के लिए, तो यह लगता है कि मैं बनाया है और उदाहरण है कि इंटरफ़ेस को लागू करता है, लेकिन जब मैं वर्ग इस पर विधि कॉल सहमत नहीं हैं। कोई विचार???

+0

मुझे लगता है कि आप और अधिक कोड या आपके वास्तविक कोड प्रदान करना होगा, इस https://gist.github.com/davedevelopment/31b143fc44ec52fcc575 काम करता है के रूप में मेरे –

+0

मैं इस मिल के रूप में अच्छी तरह से जब मजाक प्रयोग करने के लिए उम्मीद है। मैंने पाया है कि प्रक्रिया अलगाव सक्षम कार्यों के साथ चल रहे परीक्षण (लेकिन यह काफी धीमा है)। – Ross

+0

मुझे याद है कि एक ऐसी समस्या है जो वास्तव में मॉकरी में एक बग बन गई है। क्या आप मॉकरी को देव-मास्टर को अपडेट कर सकते हैं और देख सकते हैं कि समस्या अभी भी बनी हुई है या नहीं? –

उत्तर

-1

मुझे लगता है कि समस्या PHP वर्ग लोडिंग के साथ है। आपकी 'MyNamespace \ SomeSubFolder \ MyInterface' श्रेणी आपकी परीक्षण फ़ाइल से उपलब्ध नहीं है।

आपको उस नेमस्पेस को स्वत: लोड करने के लिए अपने composer.json को संशोधित करने की आवश्यकता होगी या आपको अपने परीक्षण के शीर्ष पर एक requ_once ('path/to/file/युक्त/नेमस्पेस/MyInterface.php') की आवश्यकता होगी।

हालांकि, जब आपने इंटरफ़ेस_एक्सिस्टों को आजमाया तो ऐसा लगता था। यह भी हो सकता है कि जब आपने इसे मजाक किया तो आपने अपनी नामांकित कक्षा को गलत वर्तनी दी। मैंने यह गलती भी की है।

किसी भी मामले में, मॉकरी यह देखने में सक्षम नहीं है कि कक्षा मौजूद है, इसलिए यह सिर्फ एक का आविष्कार कर रहा है।

क्या आप अपना पूरा परीक्षण स्रोत प्रदान कर सकते हैं?

+0

वह एक कन्स्ट्रक्टर का उपयोग नहीं कर रहा है। –

+0

ओह, आप सही हैं। मेरा जवाब संपादित करना – awei

10

आपको नकली घोषणा के दौरान नकली() विधि को कॉल करना चाहिए।

$mock = Mockery::mock('MyNamespace\SomeSubFolder\MyInterface'); 

$mock->shouldReceive('method1') 
    ->andReturn('foo') 
    ->mock(); 
+0

यह काम करता है, लेकिन क्यों? –

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