2012-07-09 11 views
6

मैं PHPUnit mock ऑब्जेक्ट्स को कुछ विरासत कोड के लिए काम करने की कोशिश कर रहा हूं, जिस पर मैं काम कर रहा हूं, लेकिन मुझे उस ऑब्जेक्ट के लिए इसे उप-प्राप्त करने में समस्याएं आ रही हैं और मुझे पूरा यकीन है कि इसे अवश्य ही क्योंकि मैं इसे गलत इस्तेमाल कर रहा हूं।क्या क्लास में बनाए गए स्थान को बदलने के लिए PHPUnit Mock ऑब्जेक्ट को संभव है?

वर्तमान में हमारे पास एक वर्ग है जिसका उपयोग क्वेरी बनाने के लिए पूरी तरह से किया जाता है, जब कोई अन्य वर्ग एक प्रश्न बनाना चाहता है तो यह इस वर्ग का ऑब्जेक्ट बनाता है और इसे एसक्यूएल और डेटाबेस विवरण पास करता है। मैं क्या करना चाहता हूं PHPPnit इस ऑब्जेक्ट को एक नकली संस्करण के साथ प्रतिस्थापित कर सकता है जिसे मैं परीक्षण कर सकता हूं।

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

class SampleClass{ 
    function loadData(){ 
     $sql = "SELECT * FROM users"; 
     $query = new Query(); 
     $query->query($sql); 
     while($row = $query->get_row()){ 
      if($row['email'] = ''){ 
       $this->errors[] = "Email missing from user ".$row['user_id']; 
      } 
      $result[] = $query->get_row(); 
     } 
     $this->users = $result; 
     if(count($user->errors) >= 1){ 
      return $user->errors; 
     }else{ 
      return true; 
     } 
    } 
} 

class Query{ 
    function query($sql){ 
     $this->result = mysql_query($sql); 
    } 
    function get_row(){ 
     return mysql_fetch_assoc($this->result); 
    } 
} 

PHPUnit परीक्षण फ़ाइल में एक नकली वस्तु जो एक नकली वस्तु जो मैं उपयोग कर सकते हैं के साथ SampleClass में $ क्वेरी वस्तु का स्थान ले लेगा बनाने के लिए एक तरीका नहीं है: नीचे क्या कोड दिखाई देती हैं इसका एक उदाहरण है पारित होने वाले पैरामीटर का परीक्षण करने और प्रतिक्रिया को नियंत्रित करने के लिए? मैं क्वेरी क्लास को प्रतिस्थापित नहीं कर पाऊंगा या इसका संदर्भ कैसे बदल सकता हूं, क्योंकि इसका उपयोग हमारे पूरे एप्लिकेशन में बड़े पैमाने पर किया जाता है, लेकिन मैं कम से कम इसके लिए टेस्ट फ्रेमवर्क बनाने में सक्षम होना चाहता हूं।

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

उत्तर

2

हां संभव है, इसे मारने के बजाए काम करने के तरीके के लिए नमूना डेटा की प्री-सेट सरणी वापस कर देगा।

हालांकि, आप केवल SampleClass का एक स्टब बना सकते हैं। और आप Query का वर्गीकरण या उदाहरण भी निर्भरता बना सकते हैं। तो आप वास्तव में इसे इंजेक्ट कर सकते हैं। मैं कहूंगा कि यह एक बेहतर तरीका है और आपके लिए परीक्षण लिखना बहुत आसान है।

+0

क्या यह अभी भी काम करेगा यदि उस डेटा के साथ-साथ लोडडेटा विधि का हिस्सा भी हो रहा है? मुझे एहसास है कि मैं स्टब्स के साथ विधियों को प्रतिस्थापित कर सकता हूं, लेकिन मैंने सोचा था कि सामग्री को ओवरराइड करेगा और उन तरीकों का परीक्षण करने से मुझे रोक देगा। या क्या मुझे विधि को विभाजित करने की आवश्यकता होगी ताकि क्वेरी ऑब्जेक्ट का निर्माण शेष विधि से अलग हो और उस के लिए एक स्टब बनाएं, क्वेरी के लिए परीक्षण परिणाम लौटाएं? – SolidSquid

+0

इन विधियों को केवल एक क्वेरी ऑब्जेक्ट बनाने और क्वेरी – SolidSquid

+1

"हां संभव है" के परिणाम की एक सरणी लौटने से संबंधित कार्यों में से एक को रेखांकित करने के लिए कोड का एक अतिरिक्त बिट जोड़ा गया। इंजेक्शन के बिना आप इसे कैसे करते हैं? –

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