CakePHP 2.3 - Unit testing User Login

后端 未结 2 706
星月不相逢
星月不相逢 2021-01-13 05:23

I thought I have to ask here some help to my problem. I\'ve spend whole evening with this. I have a login method in UsersController like this:

p         


        
相关标签:
2条回答
  • 2021-01-13 05:36

    I use this testcase to override the cake Auth call and Session and check if the login is successful.

    this is more of a generic solution that i use in my testing., to get the values put into the session after the user logs in and also to check if the login is successful.

    <?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' => 'mail@someemail.com', 'username' => 'mail@someemail.com', 'password' => 'abcd1234'));
        $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);
      }
    }
    
    0 讨论(0)
  • 2021-01-13 05:40

    I got this working with the following code:

    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( "/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( '"/users/login" id="UserLoginForm"', $foo );
    
            //logout mocked user
            $this->Users->Auth->logout();
        }
    
    0 讨论(0)
提交回复
热议问题