Тестирование контроллера CakePHP - как проверить действия, требующие авторизации? - PullRequest
3 голосов
/ 22 февраля 2011

Название в значительной степени говорит само за себя. Я хотел бы проверить, например, UsersController::admin_index() действие, но пользователю необходимо получить доступ к этому местоположению, поэтому при запуске теста он отправляет меня на страницу входа, и даже когда я вхожу вручную, никакие тесты не выполняются.

Так как я могу заставить торт пропустить авторизацию без редактирования фактического кода авторизации?

Кстати, если это поможет, мой код testAdminIndex() выглядит так:

function testAdminIndex() {     
    $result = $this->testAction('/admin/users/index');      
    debug($result); 
}

Ответы [ 2 ]

5 голосов
/ 25 февраля 2011

Здесь есть статья, которая освещает эту тему ...

http://mark -story.com / posts / view / testing-cakephp-controllers-the-hard-way

Рекомендуется полностью обойти «testAction» и вручную выполнить запрос после добавления значений сеанса для аутентифицированного пользователя.Пример выглядит следующим образом ...

function testAdminEdit() {
    $this->Posts->Session->write('Auth.User', array(
        'id' => 1,
        'username' => 'markstory',
    ));
    $this->Posts->data = array(
        'Post' => array(
            'id' => 2,
            'title' => 'Best article Evar!',
            'body' => 'some text',
        ),
        'Tag' => array(
            'Tag' => array(1,2,3),
        )
    );
    $this->Posts->params = Router::parse('/admin/posts/edit/2');
    $this->Posts->beforeFilter();
    $this->Posts->Component->startup($this->Posts);
    $this->Posts->admin_edit();
}
2 голосов
/ 03 марта 2016

Это указано в документации по тестированию CakePHP.

http://book.cakephp.org/3.0/en/development/testing.html#testing-actions-that-require-authentication

Тестирование действий, требующих аутентификации. Если вы используете AuthComponent, вам нужно будет заглушить данные сеанса, которые AuthComponent использует для проверки.личность пользователя.Вы можете использовать вспомогательные методы в IntegrationTestCase, чтобы сделать это.Предполагая, что у вас был ArticlesController, который содержал метод add, и этот метод add требовал аутентификации, вы могли бы написать следующие тесты:

public function testAddUnauthenticatedFails()
{
    // No session data set.
    $this->get('/articles/add');

    $this->assertRedirect(['controller' => 'Users', 'action' => 'login']);
}

public function testAddAuthenticated()
{
    // Set session data
    $this->session([
        'Auth' => [
            'User' => [
                'id' => 1,
                'username' => 'testing',
                // other keys.
            ]
        ]
    ]);
    $this->get('/articles/add');

    $this->assertResponseOk();
    // Other assertions.
}

Я использовал это

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

У меня действительно есть ролипоэтому мое решение выглядит так:

public function testDisplay()
{
 $this->session(['Auth.User.id' => 1, 'Auth.User.role' => 'admin']);

    $this->get('/pages/home');
    $this->assertResponseOk();
    $this->assertResponseContains('CakePHP');
    $this->assertResponseContains('<html>');
}
...