2010-02-16 9 views
6

Soy nuevo en las pruebas unitarias, por lo que esta es quizás una pregunta un poco tonta. Imagine, tenemos un método de modelo simple.Codeigniter Modelos de pruebas unitarias

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; 
} 

La pregunta es ¿cómo se escribiría una buena prueba? UPD: Supongo que la mejor biblioteca de pruebas unitarias para CI es Toast, por lo que estoy buscando un ejemplo, preferible que se escriba usándolo. Gracias.

Respuesta

10

Estoy usando tostadas también, y sobre todo lo uso para probar los métodos de un modelo. Para hacerlo, primero trunca todos los valores de la tabla, inserta un valor predefinido y luego obténgalo. Este es el ejemplo de prueba que he usado en mi solicitud:

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)); 

    } 
} 

estoy usando ADODB en mi solicitud, pero no te confunda con eso. Puede hacer $this->db dentro del controlador de prueba, después de cargar la biblioteca de la base de datos. Puedes ponerlo en autocarga para que se cargue automáticamente.

Mira eso en mi código, antes de ejecutar la prueba, la tabla se trunca. Después de la ejecución, obtendré cualquier error que pueda ocurrir. Yo afirmo para una inserción y actualización predefinidas. Usar Toast para probar el modelo le asegurará que el método del modelo está haciendo exactamente la tarea que desea que haga. Realice la prueba que necesita y asegúrese de cubrir todas las posibilidades de valores de entrada y salida.

+0

Genial, pero me pregunto por qué coloca todas esas pruebas dentro de una única función de prueba. ¿Por qué no ponerlos en funciones individuales? Supongo que sería más fácil realizar una búsqueda incorrecta si falla una afirmación. –

+0

En mi prueba anterior, refleja el caso real en mi aplicación. Es por eso que hay 2 'acciones' en una prueba. Incluso si hace esto, si uno falla, se mostrará, lo cual es un error, la primera o segunda acción. Puede hacer que sea lo que quiera para satisfacer sus necesidades. –