2013-06-09 11 views
7

मैं मॉकरी के साथ मॉक इलॉक्वेंट मॉडल की कोशिश कर रहा हूं। मॉडल के माध्यम सेखोज के साथ विलुप्त मॉडल का मज़ाक उड़ाते हुए()

__construct(Post $model){$this->model=$model} 

नियंत्रक में इंजेक्ट किया जाता है किया जा रहा अब मैं नियंत्रक

$post = $this->model->find($id); 

में find() समारोह बोल रहा हूँ और यहाँ PostsController

class PostsTest extends TestCase{ 

     protected $mock; 

     public function setUp() { 
     parent::setUp(); 
     $this->mock = Mockery::mock('Eloquent', 'Posts'); /*According to Jeffrey Way you have to add Eloquent in this function call to be able to use certain methods from model*/ 
     $this->app->instance('Posts', $this->mock); 
     } 

     public function tearDown() { 

     Mockery::close(); 
     } 

     public function testGetEdit() 
     { 
     $this->mock->shouldReceive('find')->with(1)->once()->andReturn(array('id'=>1)); 

     $this->call('GET', 'admin/posts/edit/1'); 

     $this->assertViewHas('post', array('id'=>1)); 
     } 
    } 

के लिए परीक्षा है रनिंग PHPUnit मुझे त्रुटि देता है:

Fatal error: Using $this when not in object context in ...\www\l4\vendor\mockery\mockery\library\Mockery\Generator.php(130) : eval()'d code on line 73 

यह स्पष्ट रूप से है क्योंकि find() को स्थिर कार्य के रूप में घोषित किया गया है। अब, कोड त्रुटियों के बिना काम करता है, तो मैं असफल मॉडल के बिना सफलतापूर्वक नकल कैसे कर सकता हूं। चूंकि हम निर्भरता इंजेक्शन पर भरोसा कर रहे हैं, इसलिए मुझे find() गैर-स्थैतिक रूप से कॉल करना होगा, अन्यथा मैं केवल Post::find() कर सकता हूं।

एक समाधान है कि मैं के साथ आया था BaseModel

public function nsFind($id, $columns = array('*')) 
{ 
    return self::find($id, $columns); 
} 

में एक गैर स्थिर find() प्रतिस्थापन बनाने के लिए है लेकिन जैसे-जैसे समारोह अलग नाम होना आवश्यक है यह एक बड़ा दर्द है!

क्या मैं कुछ गलत कर रहा हूं या आपके पास कोई बेहतर विचार है?

+0

[यह प्रश्न] (http://stackoverflow.com/questions/19753502/mocking-static-eloquent-models-methods-cluding-find) - जवाब देने के साथ जेफररी वे का जवाब नीचे काम करता है – neyl

उत्तर

2

मुझे लगता है कि यही कारण है कि जेफरी ने अपनी पुस्तक लैरवेल टेस्टिंग डिकोडेड (अध्याय 10) में रेपॉजिटरीज़ का परिचय दिया।

मजाक भी अपनी README में स्थिर तरीकों संबंधी कोई अनुभाग है, https://github.com/padraic/mockery#mocking-public-static-methods

+1

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

+0

मैंने इसे पुस्तक में संदर्भित किया था। http://d.pr/i/pbWi – JeffreyWay

4

मजाक सुवक्ता मॉडल देखें एक बहुत ही मुश्किल बात है। यह पुस्तक में शामिल है, लेकिन मैं विशेष रूप से ध्यान देता हूं कि यह एक स्टॉप-गैप है। भंडारों का उपयोग करना बेहतर है।

हालांकि, आपके प्रश्न का उत्तर देने के लिए, मुद्दा यह है कि आप निर्माता के भीतर नकली प्रदर्शन नहीं कर रहे हैं। इसे काम करने का यही एकमात्र तरीका है। यह आदर्श नहीं है, और मैं इसकी अनुशंसा नहीं करता।

+0

तो पुस्तक में कोड काम करना चाहिए या नहीं, क्योंकि मैंने पुस्तक के अनुसार बिल्कुल सही तरीके से यह निर्धारित किया है और मुझे उस पुस्तक में उल्लिखित बेसमोडेल से एक ही त्रुटि मिल रही है जो मैं हूं BaseModelTest – Ir1sh

+0

के साथ परीक्षण करने का प्रयास कर रहा हूं, मैं यह जानना चाहता हूं कि आपको इस https://laracasts.com/forum/?p=718-repository-pattern-and-eloquent-models/p1#p3546 जेफ़री के बारे में क्या कहना है। एक बार फिर से पहिया (eloquent) बनाने भंडार पैटर्न का उपयोग नहीं कर रहा है? संबंधों के बारे में क्या, उपयोगकर्ता मॉडल का उपयोग करने वाले पैकेजों के बारे में क्या? मुझे बस भंडार पैटर्न का वह हिस्सा नहीं मिलता है। – Kyslik

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

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