Модульное тестирование (PHPUnit): как войти? - PullRequest
4 голосов
/ 27 ноября 2009

Я пишу тесты для моего текущего проекта, сделанного с помощью Zend Framework. Все хорошо, но у меня проблема с проверкой действий / контроллеров зарегистрированных пользователей: мне нужно войти в систему, чтобы выполнить действие / контроллер.

Как мне войти в PHPUnit?

Ответы [ 4 ]

7 голосов
/ 27 ноября 2009

Поскольку вы говорите, что хотите тестировать действия / контроллеры, я предполагаю, что вы пишете не модульные тесты, а функциональные / интеграционные тесты, т. Е. Работаете с Zend_Test и тестируете через MVC.

Вот тест-функция, которую я использовал в проекте, где я тестирую, если вход в систему в порядке:

public function testLoggingInShouldBeOk()
{
    $this->dispatch('/login/login');
    $csrf = $this->_getLoginFormCSRF();
    $this->resetResponse();
    $this->request->setPost(array(
        'login' => 'LOGIN',
        'password' => 'PASSWORD',
        'csrfLogin' => $csrf,
        'ok' => 'Login',
    ));
    $this->request->setMethod('POST');
    $this->dispatch('/login/login');
    $this->assertRedirectTo('/');
    $this->assertTrue(Zend_Auth::getInstance()->hasIdentity());
}

Просто: я загружаю форму входа, извлекаю токен CSRF, заполняю форму и публикую ее.

Затем я могу проверить, подключен ли я.


При этом вы, вероятно, сможете извлечь часть для входа в систему, чтобы вызывать ее перед каждым из ваших тестов, требующих входа в систему действительного пользователя.

1 голос
/ 27 октября 2010

Я думаю, что эта статья может помочь вам: http://perevodik.net/en/posts/7/ Он описывает, как создать поддельную идентификацию, которую вы можете использовать, чтобы установить для среды состояние, эквивалентное входящему в систему пользователю.

1 голос
/ 27 ноября 2009

Есть другой способ. На моем объекте User у меня есть метод login(), который помещает идентификатор пользователя в сеанс и статическую переменную. В тесте setUp() я просто звоню $user->login(), и он работает. В среде тестирования сеансы не используются (настройка Zend_Session::$isUnitTested = true имеет такой эффект), и тесты основаны на статической переменной. Просто не забудьте очистить статическую переменную (logout() пользователь) на tearDown().

0 голосов
/ 10 сентября 2013

Почти так же, как Паскаль использует эту функцию:

$this->_getLoginFormCSRF();

Я создал универсальную функцию, которая возвращает значение путем загрузки формы с помощью диспетчера элементов формы:

открытая функция _getCSRFHashValueFromForm ($ formAlias, $ csrfName) { $ form = $ this-> servicemanager-> get ('FormElementManager') -> get ($ formAlias); return $ form-> get ($ csrfName) -> getValue (); }

Это, конечно, предполагает, что CSRF привязан к форме, а не к какому-либо набору полей и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...