Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Codeigniter单元测试模型_Php_Unit Testing_Codeigniter_Models - Fatal编程技术网

Php Codeigniter单元测试模型

Php Codeigniter单元测试模型,php,unit-testing,codeigniter,models,Php,Unit Testing,Codeigniter,Models,我不熟悉单元测试,所以这可能是一个有点愚蠢的问题。 想象一下,我们有一个简单的模型方法 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){

我不熟悉单元测试,所以这可能是一个有点愚蠢的问题。 想象一下,我们有一个简单的模型方法

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;
}
问题是如何为它编写一个好的测试? UPD:我想,最好的CI单元测试库是Toast,所以我正在寻找的示例最好是使用它来编写。
谢谢。

我也在使用toast,我主要用它来测试模型方法。为此,首先截断所有表值,插入预定义值,然后获取它。这是我在应用程序中使用的测试示例:

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

  }
}
class-Jobads\u测试扩展了Toast
{
函数Jobads_tests()
{
父::Toast(_文件__);
//在此处加载所需的任何模型、库等
$this->load->model('jobads\u draft\u model');
$this->load->model('jobads_model');
}
/**
*可选;此函数中的任何内容都将在每次测试之前运行
*用于清理:重置会话、更新对象等。
*/
函数_pre()
{
$this->adodb->Execute(“截断表'jobads\u draft`”);
}
/**
*可选;此函数中的任何内容都将在每次测试后运行
*我使用它设置$this->message=$this->My_model->getError();
*/
函数(u post)
{
$this->message=$this->jobads\u draft\u model->display\u errors(“”,
’); $this->message.=$this->jobads\u model->display\u errors(“”,
); } /*下面的测试*/ 功能测试\u插入\u至\u草稿() { //默认数据 $user_id=1; //测试插入 $data=数组( 'user\u id'=>$user\u id, “国家”=>“ID”, “合同开始日期”=>标准时间(“+1天”), “合同结束日期”=>标准时间(“+1周”), “上次更新”=>time() ); $jobads\u draft\u id=$this->jobads\u draft\u model->insert\u data($data); $this->\u assert\u等于($jobads\u draft\u id,1); //测试更新 $data=数组( “作业详细信息”=>“作业详细信息”, “上次更新”=>time() ); $update\u result=$this->jobads\u draft\u model->update\u data($jobads\u draft\u id,$data); $this->\u assert\u true($update\u result); //从草稿中插入测试 $payment\u data=数组( “激活日期”=>日期('Y-m-d',标准时间(“+1天”), “持续时间\金额”=>“3”, “持续时间单位”=>“周”, “付款状态”=>“已付款”, “总费用”=>123.45 ); $insert\u result=$this->jobads\u model->insert\u from\u draft($jobads\u draft\u id,$payment\u data); $this->\u assert\u true($insert\u result); //现在的草稿必须是空的 $this->_assert_false($this->jobads_draft_model->get_current_jobads_draft($user_id)); } }
我在我的应用程序中使用AdoDB,但不要对此感到困惑。加载数据库库后,您可以在测试控制器内执行
$this->db
。您可以将其置于自动加载状态,以便自动加载


在我的代码中,在测试运行之前,表被截断。运行后,我将获得可能发生的任何错误。我为预定义的插入和更新断言。使用Toast测试模型将确保模型的方法完全执行您希望它执行的任务。进行您需要的测试,并确保涵盖了输入和输出值的所有可能性。

很酷,但我想知道为什么要将所有这些测试放在一个测试函数中?为什么不把它们放在单独的函数中呢?我想如果assert语句失败,那么就更容易进行错误跟踪了?在我上面的测试中,它反映了我的应用程序中的真实情况。这就是为什么在一次测试中有两个“动作”。即使您这样做,如果其中一个失败,那么它将显示第一个或第二个操作,即fail。你可以做任何你想要的来满足你的需要。