2009-08-07 7 views
5

SimpleTest 1.0.1을 사용하여 CakePHP (방금 1.2.4 버전)로 새로운 응용 프로그램을 작성하고 있습니다. Cookbook의 관련 섹션을 읽고 Bakery에서 검색 한 후 컨트롤러 테스트에서 Mark Story의 게시물 (hard waywith mocks)을 읽었습니다.실제적인 CakePHP 컨트롤러 테스트?

불행히도, 실제 컨트롤러가 아닌 테스트에 대해서는 언급하지 않았습니다. 많은 앱에서 로그인 영역에 사이트 영역을 두었지 만 간단한 시나리오를 테스트하는 방법을 알 수 없습니다.

  • 게스트가 보호 된 페이지 리디렉션에 액세스 할 수 있습니까?
  • 유효한 자격 증명이 예상 세션 변수를 설정합니까?
  • 잘못된 자격 증명이 로그인 페이지를 다시 표시하고 오류 메시지가 표시됩니까?

컨트롤러와 테스트는 내가 생각한대로 작동하지 않습니다. 두 주장은 실패하고 나 또한 PHP 오류가 :

는 [NULL]를 실패 .../응용 프로그램/테스트/케이스/컨트롤러/users_controller.test.php 라인 79] 에서 널 안 ... /app/tests/cases/controllers/users_controller.test.php -> UsersControllerTest -> testLogin

가 [NULL]가 일치하지 않는 평등 기대가 실패 실패 [정수 : 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 여기

컨트롤러 (구운 플러스 마크 스토리의 "하드 방식"시험 방법)입니다 :

/* 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

테스트 : 여기

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')); 
    } 
    } 
} 

테스트입니다 당신은 실제로 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을 설정해야합니다.

관련 문제