为什么我的CakePHP测试夹具不工作



我正在CakePHP应用程序中测试一个插件模型。该模型使用一个名为"cron_jobs"的表,我为它设置了这个fixture:

class CronJobFixture extends CakeTestFixture
{
public $import = array('table' => 'cron_jobs');
}

我的测试课运行良好,看起来像这样:

<?php
App::uses('CronJob', 'Cron.Model');
class CronJobTest extends CakeTestCase
{
public $fixtures = array('plugin.cron.CronJob');
public function setUp()
{
parent::setUp();
$this->CronJob = new CronJob();
}
public function testCollectFailsOnMissingComponent()
{
$this->setExpectedException('InvalidArgumentException');
$this->CronJob->collect(null);
}
public function testCollectSilentOnMissingComponent()
{
$result = $this->CronJob->collect('SomeNonExistingComponent');
$this->assertEquals(null, $result);
}
// Some more tests that will need the fixture ....
}

如果我通过更换来更改测试设置

$this->CronJob = new CronJob();

带有

$this->CronJob = ClassRegistry::init("CronJob");

为了装载夹具,我得到了这个错误:

CronJobTest::testCollectSilentOnMissingComponent PDOException:SQLSTATE[42000]:语法错误或访问冲突:1064您有SQL语法错误;查看与您的在"collect"附近使用正确语法的MySQL服务器版本第1行

CronJob类中的任何东西都无法生成错误,因为这两个测试所涵盖的代码无法访问数据库。我确信我的测试数据库配置正确,因为如果我更改测试数据库配置,就会出现数据库连接错误。

我使用的是CakePHP 2.2.1、PHPUnit 3.6.12、PHP 5.4

固定装置更喜欢小写下划线约定。这样做:

public $fixtures = array('plugin.cron.cron_job');

因为它是一个插件;一定要使用ClassRegistry::init的插件表示法,如下所示:

$this->CronJob = ClassRegistry::init('Cron.CronJob');

发生该错误是因为CakePHP在没有collect()方法的情况下延迟加载非插件CronJob模型。

最新更新