CakePHP控制器的真实测试?
我正在使用CakePHP(刚刚发布的1.2.4)编写一个新的应用程序,使用SimpleTest 1.0.1。我已经阅读了的相关章节,搜索了,并阅读了Mark Story关于控制器测试的帖子(和) 不幸的是,这些都没有涉及到非平凡控制器的实际测试。许多应用程序将站点的各个区域置于登录之后,但我不知道如何测试以下简单场景:CakePHP控制器的真实测试?,php,cakephp,testing,simpletest,Php,Cakephp,Testing,Simpletest,我正在使用CakePHP(刚刚发布的1.2.4)编写一个新的应用程序,使用SimpleTest 1.0.1。我已经阅读了的相关章节,搜索了,并阅读了Mark Story关于控制器测试的帖子(和) 不幸的是,这些都没有涉及到非平凡控制器的实际测试。许多应用程序将站点的各个区域置于登录之后,但我不知道如何测试以下简单场景: 来宾访问受保护页面重定向 有效凭据是否设置了预期的会话变量 无效凭据是否重新显示登录页面并显示错误消息 下面的控制器和测试不像我想的那样工作。两个断言都失败了,我还收到一个P
- 来宾访问受保护页面重定向
- 有效凭据是否设置了预期的会话变量
- 无效凭据是否重新显示登录页面并显示错误消息
/* 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);
}
}
您所做的测试并不是真正测试您的用户Contoller,而是真正测试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组件
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);
}