我是CakePHP的新手,剛開始編寫我的第一個測試。通常在Ruby on Rails中,我測試Controller :: create操作的方法是調用create操作,然後比較調用之前和之後的模型數量,確保它增加1。在CakePHP控制器測試中訪問模型
會有人測試這個任何其他方式?
有沒有一種從CakePHP中的ControllerTest訪問模型的簡單(內置)方法?我在源代碼中找不到任何內容,並且通過Controller訪問它似乎是錯誤的。
我是CakePHP的新手,剛開始編寫我的第一個測試。通常在Ruby on Rails中,我測試Controller :: create操作的方法是調用create操作,然後比較調用之前和之後的模型數量,確保它增加1。在CakePHP控制器測試中訪問模型
會有人測試這個任何其他方式?
有沒有一種從CakePHP中的ControllerTest訪問模型的簡單(內置)方法?我在源代碼中找不到任何內容,並且通過Controller訪問它似乎是錯誤的。
我不知道爲什麼有必要測試從控制器操作調用或實例化模型的次數。
所以,如果我是測試控制器::創造... ...我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分析器輕鬆找出哪些類在特定操作中獲得了instnioated,甚至有多少次。沒有必要手動測試!
最後我做這樣的事情:
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);
注意,我對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);
}
IMO,正確的輸出測試是不夠的。如果控制器不知道,創建模型可能會失敗。創建動作的目的是創建一個模型,所以測試應確保它通過聲明增加1的模型數來創建(我在談論DB中的模型,而不是實例化或調用的模型) 。 – amiuhle