2009-08-07 12 views
5

私はSimpleTest 1.0.1を使って、CakePHP(1.2.4リリース)を使って新しいアプリケーションを書いています。 Cookbookの該当するセクションを読んだり、Bakeryで検索したり、コントローラのテストに関するMark Storyの投稿(hard wayおよびwith mocks)を読んでいます。実際のCakePHPコントローラのテスト?

残念なことに、これは、自明ではないコントローラの実際のテストについての話はありません。多くのアプリがログイン後のサイトの領域を置いていますが、簡単なシナリオをテストする方法を理解できません:

  • ゲストは保護されたページリダイレクトにアクセスできますか?
  • 有効な資格情報は、想定されるセッション変数を設定しますか?
  • 無効な資格情報でログインページがエラーメッセージとともに再表示されますか?

以下のコントローラとテストは、私が思ったように機能しません。どちらのアサーションは失敗し、私はまた、PHPのエラーを取得:

は [NULL]をFAILED [... /アプリ/テスト/ケース/コントローラ/ users_controller.test.phpライン79] でnullにすべきではありません... /app/tests/cases/controllers/users_controller.test.php - > UsersControllerTest - > TESTLOGIN

は[NULL]が一致していないよう 均等期待が失敗FAILED [整数:1] [... /アプリ/テストで/cases/controllers/users_controller.test.phpライン80] ... /アプリ/テスト/ケース/コントローラ/ users_controller.test.php - > UsersControllerTest - > TESTLOGIN

ERROR 予期しないPHPエラー[.../cake/libs/controller/components/auth.php 266]の重大度[E_NOTICE] .../app/tests/cases/controllers/users_controller.test .PHP - > UsersControllerTest - ここ> TESTLOGIN

は、コントローラ(焼きプラスマークストーリーの "苦労" 試験方法)である:ここでは

class UsersController extends AppController 
{ 
    var $name = 'Users'; 
    var $helpers = array('Html', 'Form'); 
    var $components = array('Auth'); 

    function login() 
    { 
    } 

    function logout() 
    { 
    $this->redirect($this->Auth->logout()); 
    } 

    function index() 
    { 
    $this->set('users', $this->paginate()); 
    } 

    function view($id = null) 
    { 
    if (!$id) 
    { 
     $this->Session->setFlash(__('Invalid User.', true)); 
     $this->redirect(array('action'=>'index')); 
    } 
    $this->set('user', $this->User->read(null, $id)); 
    } 

    function add() 
    { 
    if (!empty($this->data)) 
    { 
     $this->User->create(); 
     if ($this->User->save($this->data)) 
     { 
     $this->Session->setFlash(__('The User has been saved', true)); 
     $this->redirect(array('action'=>'index')); 
     } 
     else 
     { 
     $this->Session->setFlash(__('The User could not be saved. Please, try again.', true)); 
     } 
    } 
    } 

    function edit($id = null) 
    { 
    if (!$id && empty($this->data)) 
    { 
     $this->Session->setFlash(__('Invalid User', true)); 
     $this->redirect(array('action'=>'index')); 
    } 
    if (!empty($this->data)) 
    { 
     if ($this->User->save($this->data)) 
     { 
     $this->Session->setFlash(__('The User has been saved', true)); 
     $this->redirect(array('action'=>'index')); 
     } 
     else 
     { 
      $this->Session->setFlash(__('The User could not be saved. Please, try again.', true)); 
     } 
    } 
    if (empty($this->data)) 
    { 
     $this->data = $this->User->read(null, $id); 
    } 
    } 

    function delete($id = null) 
    { 
    if (!$id) 
    { 
     $this->Session->setFlash(__('Invalid id for User', true)); 
     $this->redirect(array('action'=>'index')); 
    } 
    if ($this->User->del($id)) 
    { 
     $this->Session->setFlash(__('User deleted', true)); 
     $this->redirect(array('action'=>'index')); 
    } 
    } 
} 

はテストです:

/* SVN FILE: $Id$ */ 
/* UsersController Test cases generated on: 2009-08-05 17:08:03 : 1249507923*/ 
App::import('Controller', 'Users'); 

class TestUsers extends UsersController 
{ 
    var $autoRender = false; 
    var $redirectUrl; 
    var $redirectStatus; 
    var $renderedAction; 
    var $renderedLayout; 
    var $renderedFile; 
    var $stopped; 

    function redirect($url, $status = null, $exit = true) 
    { 
    $this->redirectUrl = $url; 
    $this->redirectStatus = $status; 
    } 

    function render($action = null, $layout = null, $file = null) 
    { 
    $this->renderedAction = $action; 
    $this->renderedLayout = (is_null($layout) ? $this->layout : $layout); 
    $this->renderedFile = $file; 
    } 

    function _stop($status = 0) 
    { 
    $this->stopped = $status; 
    } 
} 

class UsersControllerTest extends CakeTestCase 
{ 
    var $fixtures = array('user'); 
    var $Users = null; 

    function startTest() 
    { 
    $this->Users = new TestUsers(); 
    $this->Users->constructClasses(); 
    $this->Users->Component->initialize($this->Users); 
    } 

    function prepareForAction() 
    { 
    $this->Users->beforeFilter(); 
    $this->Users->Component->startup($this->Users); 
    } 

    function endTest() 
    { 
    $this->Users->Session->destroy(); 
    unset($this->Users); 
    ClassRegistry::flush(); 
    } 

    //----------------------------------------------------------------------- 

    function testUsersControllerInstance() 
    { 
    $this->assertTrue(is_a($this->Users, 'UsersController')); 
    } 

    function testLogin() 
    { 
    $this->Users->data = array(
     'User' => array(
     'username' => 'admin', 
     'password' => 'admin' 
    ) 
    ); 

    $this->prepareForAction(); 
    $this->Users->login(); 

    $this->assertNotNull($this->Users->redirectUrl); 
    $this->assertEqual($this->Users->Session->read('Auth.User.id'), 1); 
    } 
} 

答えて

4

テストあなたは本当にあなたのUsersContollerをテストしていません、あなたは本当にAuをテストしていますthComponentこれを行うには、TestUsersControllerをアプリケーションと同じに設定する必要があります。私はMark's mock objects postで別の見てみると、コントローラのコードのテストを記述するためにこれらのメソッドを使用して認証コンポーネントをからかっ示唆し、

function testLogin() 
{ 
$this->Users->data = array(
       'User' => array(
        'username' => 'admin', 
        'password' => 'admin' 
       ) 
      ); 

$this->Users->params['url']['url'] = '/users/login'; 
$this->Users->params['action'] = 'login'; 
$this->prepareForAction(); 
$this->Users->login(); 

$this->assertNotNull($this->Users->redirectUrl); 
$this->assertEqual($this->Users->Session->read('Auth.User.id'), 1); 
} 

代わり:あなたのTESTLOGINの場合では、コントローラのアクションとURLを設定する必要があります。

関連する問題