2012-11-21 61 views
2

我是CakePHP的新手,剛開始編寫我的第一個測試。通常在Ruby on Rails中,我測試Controller :: create操作的方法是調用create操作,然後比較調用之前和之後的模型數量,確保它增加1。在CakePHP控制器測試中訪問模型

會有人測試這個任何其他方式?

有沒有一種從CakePHP中的ControllerTest訪問模型的簡單(內置)方法?我在源代碼中找不到任何內容,並且通過Controller訪問它似乎是錯誤的。

回答

0

我不知道爲什麼有必要測試從控制器操作調用或實例化模型的次數。

所以,如果我是測試控制器::創造... ...我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,甚至有多少次。沒有必要手動測試!

+0

IMO,正確的輸出測試是不夠的。如果控制器不知道,創建模型可能會失敗。創建動作的目的是創建一個模型,所以測試應確保它通過聲明增加1的模型數來創建(我在談論DB中的模型,而不是實例化或調用的模型) 。 – amiuhle

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

注意,我對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); 
}