2017-03-08 2 views
0

BooksControllerのaddメソッドをテストしようとしています。条件は、書籍を追加する前にユーザーがログインする必要があることです。しかし、私はテストメソッドでユーザーログインを行う方法を見つけることはありません。認証が必要なアクションをテストするにはどうすればよいですか?

私のコードは、私は/ユーザー/ログインにリダイレクト取得していますので、アサートに失敗しつつあるthis-

public function testAdd() 
    { 
     $user = ['email' => '[email protected]', 'password' => 'abcd']; 
     $this->post('/users/login', $user); 
     $book = ['title' => 'Foo', 'writer' => 'writer1', 'edition' => '2nd', 'course' => 'CSE', 'description' => 'abcd', 'price' => '200', 'status' => '0', 'user_id' => '1', 'photo' => 'abcd']; 
     $this->post('/books/add', $book); 
     $this->assertRedirect('/books'); 
} 

のようなものです。

私のログイン方法は、この問題を解決する方法はありますthis-

//Login Function 
    public function login() 
    { 
     if($this->request->session()->read('Auth.User')) 
     { 
      $this->Flash->error(__('You are already logged in.')); 
      return $this->redirect(['controller' => 'home','action' => 'index']); 
     } 
     if($this->request->is('post')) 
     { 
       $user = $this->Auth->identify(); 
       if($user) 
       { 
        $this->Auth->setUser($user); 
        return $this->redirect($this->Auth->redirectUrl()); 
       } 
     } 

     //In case of bad login 
     $this->Flash->error('You must login first.'); 
    } 

のようなものですか? ありがとうございます!

答えて

3

これは、統合テストの仕組みではなく、テストメソッドの実行後にセッションデータ、Cookie、トークン設定などがリセットされるため、単一のテストメソッドで複数のリクエストを行う必要はありません。 、間の要求ではありません。つまり、ログインしているユーザをエミュレートするには、それぞれのストレージまたはリクエストに適切な認証情報を追加するだけです。あなたがセッションストレージを使っている場合は、単にあなたのaddアクションに要求を行う前に、セッションに情報を追加します。

$this->session([ 
    'Auth' => [ 
     'User' => [ 
      'id' => 1, 
      'username' => 'foo' 
      // ... 
     ] 
    ] 
]); 

+0

ありがとうございます!あなたはそれを釘付け! –

関連する問題