2013-04-01 17 views
5

Myślałem, że muszę poprosić o pomoc w moim problemie. Spędziłem z tym cały wieczór. Mam metodę logowania w UsersController takiego:CakePHP 2.3 - Testowanie jednostek Użytkownik Login

public function login() { 

     if ($this->request->is('post')) { 
      if ($this->Auth->login()) { 
       $this->redirect(array('controller' => 'reservations', 'action' => 'index')); 
      } else { 
       $this->Session->setFlash(__('Login error.'), 'flashError'); 
      } 
     } 
    } 

Ja próbuje przetestować to z PHPUnit, więc mogę mieć pewność, że tylko ważne użytkownicy mogą zalogować → po udanym logowaniu zostaną one przekierowane do specyficznych strona. Oto mój testLogin metoda UsersControllerTest klasy:

function testLogin() { 

     $UsersController = $this->generate('Users', array(
       'components' => array(
        'Auth' => array('user') 
       ), 
      ) 
     ); 

     $UsersController->Auth->expects($this->any()) 
     ->method('user') 
     ->with('id') 
     ->will($this->returnValue(2)); 

     $data = array('User' => array(
       'student_number' => 1111111, 
       'password' => 'qwerty' 
      )); 

     //$UsersController->Auth->login($data['User']); 

     $this->testAction('/users/login', array('data' => $data, 'method' => 'get')); 
     $url = parse_url($this->headers['Location']); 
     $this->assertEquals($url['path'], '/reservations'); 
    } 

nadal jestem nauki podstaw testów jednostkowych z CakePHP. Otrzymuję ten błąd:

PHPUNIT_FRAMEWORK_ERROR_NOTICE 
Undefined index: Location 
Test case: UsersControllerTest(testLogin) 

nie mam pojęcia co jest tego przyczyną ... Co się stało z moim metody badania i jak to powinno być napisane?

Dzięki!

+1

'$ this-> headers' nie ma klucza' Lokalizacja'. Jeśli o to chodzi ... skąd pochodzi '$ this-> headers'? –

+0

Może szukasz nagłówka odpowiedzi? [CakeResponse - Ustawianie nagłówków] (http://book.cakephp.org/2.0/en/controllers/request-response.html#setting-headers) – thaJeztah

Odpowiedz

2

dostałem tej pracy z następującego kodu:

function testLogin() { 

     //mock user 
     $this->Users = $this->generate('Users', array(
       'components' => array(
        'Security' => array('_validatePost'), 
       ) 
      )); 

     //create user data array with valid info 
     $data = array(); 
     $data['User']['student_number'] = 1234567; 
     $data['User']['password'] = '[valid password here]'; 

     //test login action 
     $result = $this->testAction("https://stackoverflow.com/users/login", array(
       "method" => "post", 
       "return" => "contents", 
       "data" => $data 
      ) 
     ); 

     $foo[] = $this->view; 
     //debug($foo); 

     //test successful login 
     $this->assertNotNull($this->headers['Location']); 
     $this->assertContains('reservations', $this->headers['Location']); 
     $this->assertNotContains('"https://stackoverflow.com/users/login" id="UserLoginForm"', $foo); 

     //logout mocked user 
     $this->Users->Auth->logout(); 
    } 
+0

czy mogę zapytać, jak wygląda Twoje Urządzenie dla Użytkownika? Tylko normalne urządzenie lub jakikolwiek dodatkowy dodatek do hashowanego hasła? –

0

Używam tego testcase zastąpić rozmowę ciasto Auth i Session i sprawdzić, czy logowanie się powiedzie.

jest to bardziej ogólne rozwiązanie, którego używam w moich testach. Aby uzyskać wartości wprowadzone do sesji po zalogowaniu się użytkownika, a także w celu sprawdzenia, czy logowanie się powiodło.

<?php 
App::uses('UsersController', 'Controller'); 
App::uses('AuthComponent', 'Controller/Component'); 
App::uses('CakeRequest', 'Network'); 
App::uses('CakeResponse', 'Network'); 

$_SERVER['HTTP_USER_AGENT'] = ''; 

class stubSession { 
    public $data = array(); 

    public function write($key, $value){ 
    $this->data[$key] = $value; 
    } 

    public function read($key){ 
    if(array_key_exists($key, $this->data)){ 
     return $this->data[$key]; 
    } 
    } 

    public function renew() { 

    } 

    public function setFlash(){ 

    } 

    public function delete() { 

    } 

    public function check(){ 

    } 
} 

class stubRequest { 
    public $data = array(); 

    function __construct($data) { 
    $this->data = $data; 
    } 

    public function is() { 
    return true; 
    } 

    public function clientIp(){ 

    } 
} 

class stubAuthComponent extends AuthComponent{ 

    public static $_session; 

    public function __construct($args, $session){ 
    parent::__construct($args); 
    $this->Session = $session; 
    self::$_session = $session; 
    $this->request = new CakeRequest(); 
    $this->response = new CakeResponse(); 
    } 

    public function loggedIn() { 
    return self::$_session->read(self::$sessionKey) != array(); 
    } 

    public function logout(){ 

    } 

    public static function user($key) { 
    $user = self::$_session->read(self::$sessionKey); 
    return $user[$key]; 
    } 
} 

class UsersControllerTest extends UsersController { 

    function __construct($data){ 
    $this->User = ClassRegistry::init('User'); 
    $this->Session = new stubSession(); 
    $this->Auth = new stubAuthComponent(new ComponentCollection(), $this->Session); 
    $this->request = new stubRequest($data); 
    } 

    public function redirect(){ 

    } 
} 

class TestUsersController extends CakeTestCase { 

    public function testLogin(){ 
    $_POST = array('User' => array('email' => '[email protected]', 'username' => '[email protected]', 'password' => 'testuser123')); 
    $usersController = new UsersControllerTest($_POST); 
    $usersController->login(); 
    $login = $usersController->Auth->loggedIn(); 
    //debug($usersController->Session->data); //you can test the session key value in here 
    $this->assertEquals($login, true); 
    } 
}