Модели Поблочного тестирования Codeigniter

Я плохо знаком с поблочным тестированием, таким образом, это - возможно, немного немого вопроса. Вообразите, у нас есть простой образцовый метод.

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

Вопрос состоит в том, как тест _good был бы записан для него? UPD: Я предполагаю, лучшая библиотека поблочного тестирования для CI является Тостом, таким образом, пример я ищу, предпочтительный быть записанным с помощью него.Спасибо.

6
задан DCrystal 16 February 2010 в 14:15
поделиться

1 ответ

Я тоже использую тост, и в основном использую его для тестирования методов модели. Для этого сначала обрежьте все значения таблицы, вставьте предопределенное значение, а затем получите его. Это пример теста, который я использовал в своем приложении:

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 внутри тестового контроллера после загрузки библиотеки базы данных. Вы можете поместить его в автозагрузку, чтобы он загрузился автоматически.

Посмотрите, что в моем коде перед запуском теста таблица усекается. После запуска я получу любую ошибку, которая может произойти. Я утверждаю, что предопределенная вставка и обновление. Использование Toast для тестирования модели позволит вам убедиться, что метод модели выполняет именно ту задачу, которую вы хотите. Сделайте тест, который вам нужен, и убедитесь, что вы охватываете все возможности ввода и вывода значений.

10
ответ дан 10 December 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: