Реальное тестирование контроллеров CakePHP?

Я пишу новое приложение с CakePHP (только что выпущенным 1.2.4), используя SimpleTest 1.0.1. Я прочитал соответствующие разделы Поваренной книги , обыскал в Хлебопекарне и прочитал пометки Марка Стори о тестировании контроллера ( трудный путь и с издевательствами ).

К сожалению, ничто из этого не говорит о реальном тестировании нетривиальных контроллеров. Многие приложения помещают области сайта за регистрацию, но я не могу понять, как протестировать простой сценарий:

  • гостевой доступ к переадресации защищенной страницы?
  • действительные учетные данные задают ожидаемые переменные сеанса?
  • Недействительные учетные данные повторно отображают страницу входа с сообщением об ошибке?

Контроллер и тест ниже не работают, как я думал. Оба утверждения терпят неудачу, и я также получаю ошибку PHP:

FAILED [NULL] не должен быть пустым в [… / app / tests / cases / controllers / users_controller.test.php line 79] … / app / tests / cases / controllerlers / users_controller.test.php -> UsersControllerTest -> testLogin

FAILED Равное ожидание не выполняется, поскольку [NULL] не соответствует [Integer: 1] в [… / app / tests / cases / controller / users_controller.test.php line 80] … / app / tests / cases / controller / users_controller.test.php -> UsersControllerTest -> testLogin

ERROR Неожиданная ошибка PHP [Undefined index: action] severity [E_NOTICE] в [… / cake / libs / controller / components / auth.php строка 266] … / приложение / тесты / случаи / контроллеры / users_controller.test. php -> UsersControllerTest -> testLogin

Вот контроллер (испеченный плюс метод тестирования «Hard way» Mark Story):

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); } } не /* 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); } } 

Related of "Реальное тестирование контроллеров CakePHP?"

Тест, который у вас есть, на самом деле не проверяет ваш UserContoller, вы действительно тестируете AuthComponent. Если вы хотите сделать это, вам нужно убедиться, что вы настроили свой TestUsersController так же, как и в своем приложении. В случае вашего testLogin вам нужно установить действие и URL-адрес контроллера:

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

В качестве альтернативы, я бы предложил еще раз взглянуть на пост макетных объектов Марка и использовать эти методы для написания тестов для кода контроллера и издевательств над компонентом auth.