2016-04-23 3 views
2

В настоящее время я пытаюсь протестировать контроллер, который использует компонент аутентификации для извлечения идентификатора пользователя. Поскольку я довольно новичок в тестировании на единицу/интеграцию, я понятия не имею, как это сделать. Кроме того, все содержание, которое я мог бы найти для этой конкретной проблемы написана для CakePHP версии 2.Mock auth cakephp 3

функция управления: тест

public function favorite(){ 
    // Particular line where the problem is occurring: 
    $userId = $this->Auth->User()['id']; 
    // Get all favorite pictures of the user 
    $query = $this->UsersPictures->getFavoritePictures($userId); 

    $results = $query->all(); 
    // Replace the link in the result set by a presigned url of Amazon 
    foreach($results as $result){ 
     $result->picture->link = $this->Aws->getTokenizedItem($result->picture->link); 
    } 
    $this->set([ 
     'success' => true, 
     'data' => [ 
      'pictures' => $results 
     ], 
     '_serialize' => ['success', 'data'] 
    ]); 
} 

Интеграция:

public function testFavoriteShouldPass(){ 
    $this->configRequest([ 
     'headers' => [ 
      'Accept' => 'application/json' 
     ] 
    ]); 
    $this->get('api/pictures/favorite/1.json'); 

    $expected = [ 
     'success' => true, 
     'data' => [ 
       [ 
       'user_id' => 1, 
       'picture_id' => 1, 
       'created' => '2016-04-03T20:35:40+0000', 
       'modified' => '2016-04-03T20:35:40+0000', 
       'picture' => [ 
        'id' => 1, 
        'album_id' => 1, 
        'description' => 'Lorem ipsum dolor sit amet', 
        'link' => 'test', 
        'favorite' => true, 
        'created' => null, 
        'modified' => null, 
        'cover_photo' => true 
       ] 
      ] 
     ] 
    ]; 
    $this->assertEquals($expected, $response); 
} 

Мой вопрос, как я могу вставьте пользователя с идентификатором по умолчанию 1 для $ this-> Auth-> User() ['id']. Я видел в других вопросах, которые мне нужно использовать что-то, что выглядит следующим образом:

$this->_controller->Auth 
     ->staticExpects($this->any()) 
     ->method('user') 
     ->will($this->returnValue([ 
      'id' => 1, 
      'username' => 'admin', 
      'created' => '2013-05-08 00:00:00', 
      'modified' => '2013-05-08 00:00:00', 
      'email' => '[email protected]', 
     ])); 

Однако, я прочитал, что staticExpects осуждается от PHPUnit версии 3.8 (я использую 5.2). Как мне это издеваться?

+0

Я думаю, что вы не поняли вопрос. Проблема в том, что я хочу назначить фиксированное значение $ this-> Auth-> User ('id') во время тестирования (например, user_id always 1). Таким образом, я могу проверить, работают ли действия контроллера, как они должны быть. – markvdlaan93

ответ

1

С благодаря Azahar :), это работает для меня:

public function controllerSpy($event) 
{ 
    parent::controllerSpy($event); 

    if (isset($this->_controller)) { 
     $this->_controller->Auth->setUser([ 
      'id' => 1, 
      'username' => 'testtesttesttest', 
      'email' => '[email protected]', 
      'first_name' => 'John', 
      'last_name' => 'Doe', 
      'uuid' => 'wepoewoweo-ew-ewewpoeopw', 
      'sign_in_count' => 1, 
      'current_sign_in_ip' => '127.0.0.1', 
      'active' => true 
     ]); 
    } 
} 
0

Вы можете установить данные сессии в ваших тестах интеграции с использованием $this->session(), например (из CakePHP книги):

// Set session data 
$this->session([ 
    'Auth' => [ 
     'User' => [ 
      'id' => 1, 
      'username' => 'testing', 
      // other keys. 
     ] 
    ] 
]); 

Вы действительно можете найти его в своей документации: http://book.cakephp.org/3.0/en/development/testing.html#controller-integration-testing

Вы можете найти это в разделе

Тестирование действия, которые требуют аутентификации

Если вы хотите использовать одни и те же данные сеанса на каждый тест вы можете использовать метод настроят интеграции тестового класса, например, так:

public function setUp() 
{ 
    parent::setUp(); 
    // Set session data 
    $this->session([ 
    'Auth' => [ 
     'User' => [ 
       'id' => 1, 
       'username' => 'testing', 
       // other keys. 
      ] 
     ] 
    ]); 
} 
+0

Извините, мне кажется, я забыл сказать, что я использую аутентификацию без гражданства, в которой не используется какой-либо сеанс. В нормальных ситуациях это был бы путь, но я не мог найти ничего для этой конкретной проблемы в документах Cakephp. – markvdlaan93

+1

Вы пробовали функцию controllerSpy? Пример: 'public function controllerSpy ($ event) { parent :: controllerSpy ($ event); if (isset ($ this -> _ controller)) { $ this -> _ controller-> Auth-> setUser (['username' => 'admin', 'is_admin' => true]);} } ' – azahar

+0

Ницца! Это действительно сработало. Я уже обошел его с глобальными переменными состояния, но это гораздо лучшее решение. – markvdlaan93

Смежные вопросы