私は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 - > TESTLOGINERROR 予期しない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);
}
}