2009-08-12 8 views
9

में नकली ऑब्जेक्ट्स बनाना मैंने खोजा है लेकिन मैं जो खोज रहा हूं उसे काफी नहीं मिल सकता है और मैनुअल इस संबंध में बहुत मदद नहीं करता है। मैं यूनिट परीक्षण के लिए बिल्कुल नया हूं, इसलिए सुनिश्चित नहीं है कि मैं सही रास्ते पर हूं या नहीं। वैसे भी, सवाल पर।PHP इकाई

<?php 
    class testClass { 
     public function doSomething($array_of_stuff) { 
      return AnotherClass::returnRandomElement($array_of_stuff); 
     } 
    } 
?> 

अब, स्पष्ट रूप से मैं AnotherClass::returnRandomElement($array_of_stuff); चाहते एक ही बात हर बार वापस जाने के लिए: मैं एक वर्ग है। मेरा सवाल है, मेरे यूनिट टेस्ट में, मैं इस ऑब्जेक्ट को कैसे नकल कर सकता हूं?

मैंने परीक्षण फ़ाइल के शीर्ष पर AnotherClass जोड़ने का प्रयास किया है, लेकिन जब मैं AnotherClass का परीक्षण करना चाहता हूं तो मुझे "कक्षा को पुन: वर्गीकृत नहीं किया जा सकता" त्रुटि मिलती है।

मुझे लगता है कि मैं कारखाने के वर्गों को समझता हूं, लेकिन मुझे यकीन नहीं है कि मैं इस उदाहरण में कैसे आवेदन करूंगा। क्या मुझे एक पूरी तरह से पृथक एक और क्लास क्लास लिखना होगा जिसमें टेस्ट डेटा था और फिर फैक्ट्री क्लास का उपयोग वास्तविक अदरक्लास के बजाय लोड करने के लिए करें? या सिर्फ एक लाल हेरिंग फैक्टरी पैटर्न का उपयोग कर रहा है। सेटअप() फ़ंक्शन में

$RedirectUtils_stub = $this->getMockForAbstractClass('RedirectUtils'); 

    $o1 = new stdClass(); 
    $o1->id = 2; 
    $o1->test_id = 2; 
    $o1->weight = 60; 
    $o1->data = "http://www.google.com/?ffdfd=fdfdfdfd?route=1"; 
    $RedirectUtils_stub->expects($this->any()) 
     ->method('chooseRandomRoot') 
     ->will($this->returnValue($o1)); 
    $RedirectUtils_stub->expects($this->any()) 
     ->method('decodeQueryString') 
     ->will($this->returnValue(array())); 

, लेकिन इन स्टब्स अनदेखी कर रहे हैं और मुझे लगता है कि क्या यह कुछ मैं गलत कर रहा हूँ, या जिस तरह से मैं कर रहा हूँ तक पहुँचने से काम नहीं कर सकते हैं:

मैं इस कोशिश की AnotherClass विधियां।

सहायता! यह मुझे पागल कर देता है।

उत्तर

6

यूनिट टेस्ट के साथ आप 'टेस्ट' कक्षाएं बनाना चाहते हैं जिसमें स्थैतिक डेटा है, और फिर उन्हें अपनी परीक्षण कक्षा में पास करें। यह परीक्षण से चर हटा देता है।

class Factory{ 
    function build() 
    { 
     $reader = new reader(); 
     $test = new test($reader); 
     // ..... do stuff 
    } 

} 

class Factory{ 
    function build() 
    { 
     $reader = new reader_mock(); 
     $test = new test($reader); 
     // ..... do stuff 
    } 

} 
class reader_mock 
{ 
    function doStuff() 
    { 
     return true; 
    } 
} 

क्योंकि आप स्टेटिक वर्ग का उपयोग कर रहे हैं, तो आप इस कार्यक्रम से AnotherClass निकालने के लिए, और उसके बाद इसे पुन: इतना है कि यह केवल काम करता है कि परीक्षण डेटा वापस शामिल करना होगा। आम तौर पर, हालांकि, आप वास्तव में प्रोग्राम से कक्षाओं को हटाना नहीं चाहते हैं, यही कारण है कि आप उपर्युक्त उदाहरण की तरह कक्षाएं पास करते हैं।

+0

शानदार, प्रतिक्रिया के लिए धन्यवाद। हालांकि एक सवाल; इसलिए, मुझे अपनी फैक्टरी कक्षा मिली है, जो मेरे लिए सभी उदाहरण बनाती है। यह वह वर्ग है जो उत्पादन में जाता है। क्या मैं इस वर्ग में नकली वस्तु सामान जोड़ता हूं, या क्या मैं मुख्य कारखाना वर्ग को उत्पादन के रूप में छोड़ देता हूं, फिर unittests के लिए एक नया कारखाना वर्ग जोड़ें? – Mike

+0

आपको रीयलिल करता है। आप परीक्षण के लिए या तो एक नया कारखाना वर्ग बना सकते हैं, या आप यह सुनिश्चित कर सकते हैं कि आपने परीक्षण के बाद अपनी फैक्टरी कक्षा को साफ़ कर लिया है। –

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