我是 CakePHP 的新手,我刚刚开始编写我的第一个测试。通常在使用 Ruby on Rails 时,我测试 Controller::create 动作的方法是调用 create 动作,然后比较调用前后的模型数量,确保它增加了 1。
有人会以其他方式测试吗?
是否有一种简单的(内置)方法可以从 CakePHP 中的 ControllerTest 访问模型?我在源代码中找不到任何东西,并且通过 Controller 访问它似乎是错误的。
我是 CakePHP 的新手,我刚刚开始编写我的第一个测试。通常在使用 Ruby on Rails 时,我测试 Controller::create 动作的方法是调用 create 动作,然后比较调用前后的模型数量,确保它增加了 1。
有人会以其他方式测试吗?
是否有一种简单的(内置)方法可以从 CakePHP 中的 ControllerTest 访问模型?我在源代码中找不到任何东西,并且通过 Controller 访问它似乎是错误的。
请注意,我是 CakePHP 的新手,但带着这个问题来到这里。这就是我最终做的事情。
我从@amiuhle 得到了我的想法,但我只是在 中手动完成setUp
,就像他们在http://book.cakephp.org/2.0/en/development/testing.html的模型测试中提到的那样。
public function setUp() {
$this->Signup = ClassRegistry::init('Signup');
}
public function testMyTestXYZ() {
$data = array('first_name' => 'name');
$countBefore = $this->Signup->find('count');
$result = $this->testAction('/signups/add',
array(
'data' => array(
'Signup' => $data)
)
);
$countAfter = $this->Signup->find('count');
$this->assertEquals($countAfter, $countBefore + 1);
}
我最终做了这样的事情:
class AbstractControllerTestCase extends ControllerTestCase {
/**
* Load models, to be used like $this->DummyModel->[...]
* @param array
*/
public function loadModels() {
$models = func_get_args();
foreach ($models as $modelClass) {
$name = $modelClass . 'Model';
if(!isset($this->{$name})) {
$this->{$name} = ClassRegistry::init(array(
'class' => $modelClass, 'alias' => $modelClass
));
}
}
}
}
然后我的测试继承自AbstractControllerTestCase
,调用并可以$this->loadModels('User');
在setUp
测试中做这样的事情:
$countBefore = $this->UserModel->find('count');
// call the action with POST params
$countAfter = $this->UserModel->find('count');
$this->assertEquals($countAfter, $countBefore + 1);
我不确定为什么有必要测试从控制器操作调用或实例化模型的次数。
因此,如果我正在测试 Controller::create... 我的 ControllerTest 将包含以下内容:
testCreate(){
$result = $this->testAction('/controller/create');
if(!strpos($result,'form')){
$this->assertFalse(true);
}
$data = array(
'Article' => array(
'user_id' => 1,
'published' => 1,
'slug' => 'new-article',
'title' => 'New Article',
'body' => 'New Body'
)
);
$result = $this->testAction(
'/controller/create',
array('data' => $data, 'method' => 'post')
);
if(!strpos($result,'Record has been successfully created')){
$this->assertFalse(true);
}
}
您要测试的主要内容是您是否获得了正确的输入输出。您可以使用 xDebug 分析器轻松找出在特定操作中实例化了哪些类,甚至实例化了多少次。无需手动测试!