2017-03-08 2 views
0

Ich versuche, die Add-Methode meines BooksControllers zu testen. Voraussetzung ist, dass ein Benutzer angemeldet sein muss, bevor er ein Buch hinzufügen kann. Aber ich finde keine Möglichkeit, einen Benutzer in der Testmethode anzumelden.Wie testen Sie Aktionen, die eine Authentifizierung erfordern?

Mein Code ist wie 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'); 
} 

Die Assertion fehlgeschlagen ist immer, weil ich zu/Benutzer/login weitergeleitet zu werden.

ist meine Login-Methode wie 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.'); 
    } 

Gibt es eine Möglichkeit, dieses Problem zu beheben? Vielen Dank im Voraus!

Antwort

3

So funktionieren Integrationstests nicht, sollten Sie nicht mehrere Anfragen in einer einzigen Testmethode machen, kann dies leicht zu Umweltverschmutzung führen, da Sitzungsdaten, Cookies, Tokenkonfigurationen usw. erst zurückgesetzt werden, nachdem die Testmethode ausgeführt wurde und nicht zwischen Anfragen.

Das Emulieren eines angemeldeten Benutzers funktioniert einfach dadurch, dass dem entsprechenden Speicher oder der Anforderung entsprechende Authentifizierungsinformationen hinzugefügt werden. Wenn Sie die Sitzung Speicher verwendet werden, fügen Sie einfach die Informationen zu der Sitzung, bevor die Anforderung an Ihre add Aktion machen:

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

Siehe auch

+0

Danke! Du hast den Nagel auf den Kopf getroffen! –

Verwandte Themen