2010-02-16 10 views
6

मैं इकाई परीक्षण के लिए नया हूं, इसलिए यह शायद थोड़ा गूंगा सवाल है। कल्पना कीजिए, हमारे पास एक साधारण मॉडल विधि है।कोडिनेटर यूनिट-परीक्षण मॉडल

public function get_all_users($uid = false, $params = array()){ 
    $users = array(); 
    if(empty($uid) && empty($params)){return $users;} 
    $this->db->from('users u'); 
    if($uid){ 
     $this->db->where('u.id',(int)$id); 
    } 
    if(!empty($params)){ 
     if(isset($params['is_active']){ 
      $this->db->where('u.status ', 'active'); 
     } 
     if(isset($params['something_else']){ // some more filter actions} 
    } 
    $q = $this->db->get(); 
    if($q->num_rows()){ 
     foreach($q->result_array() as $user){ 
      $users[$user['id']] = $user; 
     } 
    } 
    $q->free_result(); 
    return $users; 
} 

प्रश्न यह है कि इसके लिए एक अच्छा परीक्षण कैसे लिखा जाएगा? यूपीडी: मुझे लगता है, सीआई के लिए सबसे अच्छी यूनिट-परीक्षण लाइब्रेरी टोस्ट है, इसलिए उदाहरण के लिए मैं देख रहा हूं, इसका उपयोग करके बेहतर लिखा जा सकता है। धन्यवाद।

उत्तर

10

मैं टोस्ट का भी उपयोग कर रहा हूं, और ज्यादातर मैं इसे मॉडल विधियों का परीक्षण करने के लिए उपयोग करता हूं। ऐसा करने के लिए, पहले सभी तालिका मानों को छोटा करें, एक पूर्वनिर्धारित मान डालें, फिर इसे प्राप्त करें। यह मैं अपने आवेदन में इस्तेमाल किया परीक्षण के उदाहरण है:

class Jobads_tests extends Toast 
{ 
    function Jobads_tests() 
    { 
    parent::Toast(__FILE__); 
    // Load any models, libraries etc. you need here 
    $this->load->model('jobads_draft_model'); 
    $this->load->model('jobads_model'); 
    } 

    /** 
    * OPTIONAL; Anything in this function will be run before each test 
    * Good for doing cleanup: resetting sessions, renewing objects, etc. 
    */ 
    function _pre() 
    { 
    $this->adodb->Execute("TRUNCATE TABLE `jobads_draft`"); 
    } 

    /** 
    * OPTIONAL; Anything in this function will be run after each test 
    * I use it for setting $this->message = $this->My_model->getError(); 
    */ 
    function _post() 
    { 
    $this->message = $this->jobads_draft_model->display_errors(' ', '<br/>'); 
    $this->message .= $this->jobads_model->display_errors(' ', '<br/>'); 
    } 

    /* TESTS BELOW */ 
    function test_insert_to_draft() 
    { 
    //default data 
    $user_id = 1; 

    //test insert 
    $data = array(
     'user_id' => $user_id, 
     'country' => 'ID', 
     'contract_start_date' => strtotime("+1 day"), 
     'contract_end_date' => strtotime("+1 week"), 
     'last_update' => time() 
    ); 
    $jobads_draft_id = $this->jobads_draft_model->insert_data($data); 
    $this->_assert_equals($jobads_draft_id, 1); 

    //test update 
    $data = array(
     'jobs_detail' => 'jobs_detail', 
     'last_update' => time() 
    ); 
    $update_result = $this->jobads_draft_model->update_data($jobads_draft_id, $data); 
    $this->_assert_true($update_result); 

    //test insert_from_draft 
    $payment_data = array(
     'activation_date' => date('Y-m-d', strtotime("+1 day")), 
     'duration_amount' => '3', 
     'duration_unit' => 'weeks', 
     'payment_status' => 'paid', 
     'total_charge' => 123.45 
    ); 
    $insert_result = $this->jobads_model->insert_from_draft($jobads_draft_id, $payment_data); 
    $this->_assert_true($insert_result); 

    //draft now must be empty 
    $this->_assert_false($this->jobads_draft_model->get_current_jobads_draft($user_id)); 

    } 
} 

मैं अपने आवेदन में adodb उपयोग कर रहा हूँ, लेकिन उस के साथ भ्रमित नहीं मिलता। डेटाबेस लाइब्रेरी लोड करने के बाद, आप परीक्षण नियंत्रक के अंदर $this->db कर सकते हैं। आप इसे ऑटोलोड में डाल सकते हैं ताकि यह स्वचालित रूप से लोड हो जाए।

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

+0

कूल, लेकिन मुझे आश्चर्य है कि आप उन सभी परीक्षणों को एक परीक्षण समारोह में क्यों रखते हैं? उन्हें व्यक्तिगत कार्यों में क्यों न रखें - मुझे लगता है कि अगर कोई कथन कथन विफल हो जाता है तो यह बगट्रैक को आसान बना देगा? –

+0

उपरोक्त मेरे परीक्षण में, यह मेरे आवेदन में असली मामला दर्शाता है। यही कारण है कि एक परीक्षण में 2 'कार्रवाई' हैं। यहां तक ​​कि यदि आप ऐसा करते हैं, यदि कोई विफल रहता है, तो यह प्रदर्शित होगा, जो विफल है, पहली या दूसरी कार्रवाई। आप जो कुछ भी अपनी जरूरत के अनुरूप करना चाहते हैं उसे बना सकते हैं। –