0

ユーザーが自分のプロファイルのみを編集できるように、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() が呼び出されていないように見えます。私は途方に暮れています。ご協力いただきありがとうございます。

4

1 に答える 1

-2

最初:テストコードでは、編集メソッドではなくビューメソッドを呼び出します

2番目: isAuthorized() はこのためではありません。この方法では、誰がどの機能にアクセスできるかを定義するだけでよく、アプリケーションのビジネス ロジックはありません。

3 番目: 通常のユーザーが自分のプロファイルだけを編集できるように制限したい場合は、dit() メソッドを次のように変更する必要があります。

public function edit() {
  $this->request->data['User']['id'] = $this->Auth->User('id');
  if ($this->request->is('post') || $this->request->is('put')) {
    if ($this->User->save($this->request->data)) {
      $this->Session->setFlash(__('The user has been saved.'));
      return $this->redirect(array('action' => 'index'));
    } else {
      $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
  }
  } else {
    $this->request->data = array('User' => $this->Auth->User());
  }
}

そして、echo $this->Form->input('id'); を削除します。あなたの編集ビューから。

私はこのトピックについて本を書いています。ここですぐに利用できるようになります: https://leanpub.com/CakePHPUserAuthentication/

于 2013-11-16T17:10:26.717 に答える