我是CakePHP的新手,我刚刚开始编写我的第一个测试。通常使用Ruby on Rails,我测试Controller :: create动作的方法是调用create动作,然后比较调用之前和之后的模型数量,确保它增加1。
有人会以其他方式测试吗?
是否有一种简单的(内置)方法可以从CakePHP中的ControllerTest访问模型?我在源代码中找不到任何内容,并且通过Controller访问它似乎是错误的。
答案 0 :(得分:2)
请注意,我是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);
}
答案 1 :(得分: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);
答案 2 :(得分:0)
我不确定为什么有必要测试从控制器操作调用或实例化模型的次数。
所以,如果我测试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探查器轻松找出在特定操作中实例化的类甚至多少次。无需手动测试!