I have read through the Cookbook, searched on the Bakery and read Mark Story's two blog postings about testing controllers. I am primarily a Rails developer, so there is certainly some bias here, but: either I am missing something or controller testing is far more complicated with Cake than it should be.
Can anyone point me to some examples, tutorials or blog postings that talk about serious testing of controllers? I am not interested in simplistic examples. Mark's postings cover easy stuff well enough. Some examples of things I want to do: test if a controller action is properly protected by AuthComponent, then verify that a valid user/ password combination grants access, and that incorrect credentials result in another login page with a flash message. The controller test below is a standard baked test, with code from Mark's "hard way" post. Running this test (Cake 1.2.4 + SimpleTest 1.0.1) with a valid user fixture results in two failed assertions and a PHP error. The error, in particular, makes me wonder if I'm way off in the weeds. FAILED [NULL] should not be null at [.../app/tests/cases/controllers/ users_controller.test.php line 79] .../app/tests/cases/controllers/users_controller.test.php -> UsersControllerTest -> testLogin FAILED Equal expectation fails as [NULL] does not match [Integer: 1] at [.../ app/tests/cases/controllers/users_controller.test.php line 80] .../app/tests/cases/controllers/users_controller.test.php -> UsersControllerTest -> testLogin ERROR Unexpected PHP error [Undefined index: action] severity [E_NOTICE] in [.../cake/libs/controller/components/auth.php line 266] .../app/tests/cases/controllers/users_controller.test.php -> UsersControllerTest -> testLogin Here's the controller and test. Anyone see any obvious mistakes? <?php 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')); } } } ?> <?php /* 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); } } ?> --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "CakePHP" group. To post to this group, send email to cake-php@googlegroups.com To unsubscribe from this group, send email to cake-php+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/cake-php?hl=en -~----------~----~----~----~------~----~------~--~---