使用CakePhP和PHPUnit进行单元测试

时间:2014-10-29 14:12:13

标签: unit-testing cakephp phpunit cakephp-2.0

我正在尝试使用CakePhP 2.3和PHPUnit 2.7进行单元测试。我想测试客户控制器中的索引功能。 在我的控制器中,我有:

public function index() {

    $this->Customer->recursive = -1;
    $data = $this->paginate('Customer', array( 'Customer.status'=>'active'));
    $this->set('customers', $data);

}

我尝试按照book.cakephp.org中的示例进行操作,因此我创建了Fixture类,其中我导入了Customer模式和所有记录。

class CustomerFixture  extends CakeTestFixture{

  public $import = array('model' => 'Customer', 'records' => true);

}

最后我的测试类看起来像这样:

class CustomersControllerTest extends ControllerTestCase {

  public $fixtures = array('app.customer');

   public function testIndex() {

      $result = $this->testAction('/customers/index');
      debug($result);
   }
}

当我运行测试时,出现以下错误:

数据库错误 错误:SQLSTATE [23000]:完整性约束违规:1062键'PRIMARY'重复输入'8'

你有什么想法可能是什么问题吗?

1 个答案:

答案 0 :(得分:1)

在app / Config文件夹的database.php中,你必须添加一个$ test变量。

例如

class DATABASE_CONFIG {

    public $default = array(
        'datasource' => 'Database/Mysql',
        'persistent' => true,
        'host' => 'localhost',
        'port' => 3306,
        'login' => 'root',
        'password' => 'xxxx',
        'database' => 'mydatabase',
        'encoding' => 'utf8'
    );

    public $test = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'port' => 3306,
        'login' => 'root',
        'password' => 'xxxx',
        'database' => 'mydatabase_test',
        'encoding' => 'utf8'
    );

}

然后您的单元测试将使用mydatabase_test来测试您的代码。因为现在它使用默认数据库。