ユーザーが自分のプロファイルのみを編集できるように、UsersController の単体テストを作成しています。私は CakePHP 2.4.2 と AuthComponent を Controller と共に使用してこれを実行しています。
認証構成:
public $components = array(
'Auth' => array(
'loginRedirect' => '/',
'logoutRedirect' => '/',
'authenticate' => array('Ldap'),
'authError' => 'You are not allowed to access this page',
'authorize' => 'Controller'));
UsersController の isAuthorized():
public function isAuthorized($user = null) {
if($this->Auth->loggedIn()) {
return $this->request->params['pass'][0] == $user['id'];
}
return false;
}
編集の単体テスト:
public function testEdit() {
$result = $this->testAction('/users/view/1', array('return' => 'view'));
$this->assertRegExp('/Adam C Hobaugh/', $result);
$user = $this->generate('Users', array(
'components' => array(
'Session',
'Auth' => array('user'))));
$test = array('id' => 1);
$user->Auth->expects($this->once())->method('loggedIn')
->with($this->returnValue(true));
$user->Auth->expects($this->any())->method('user')
->with($this->returnValue($test));
$user->Session->expects($this->any())->method('setFlash');
$result = $this->testAction('/users/edit/1', array(
'return' => 'headers',
'data' => array('User' => array( {user array} ))));
debug($result);
$this->assertContains('/users', @$result['Location']);
$result = $this->testAction('/users/view/1', array('return' => 'view'));
$this->assertRegExp('/John Jacob Doe/', $result);
}
Expectation failed for method name is equal to <string:loggedIn> when invoked 1 time(s). Method was expected to be called 1 times, actually called 0 times.
テストを実行すると得られます。また、this->once() を $this->any() に変更し、$test 配列の id を 2 に変更すると、失敗するはずの状況がブラウザーから実行され、テストに成功します。
これらを組み合わせると、単体テスト中に isAuthorized() が呼び出されていないように見えます。私は途方に暮れています。ご協力いただきありがとうございます。