Модульное тестирование (PHPUnit):как войти в систему?
-
05-07-2019 - |
Вопрос
Я пишу тесты для своего текущего проекта, созданные с помощью Zend Framework.Все в порядке, но у меня проблема с тестированием зарегистрированных действий пользователей / контроллеров:Мне нужно войти в систему, чтобы иметь возможность выполнить действие / контроллер.
Как я могу войти в систему в PHPUnit?
Решение
Поскольку вы говорите, что хотите протестировать действия / контроллеры, я полагаю, вы пишете не модульные тесты, а функциональные / интеграционные тесты, то есть работаете с 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, заполняю форму и публикую ее.
Затем я могу проверить, подключен ли я.
При этом вы, вероятно, можете извлечь часть входа в систему, чтобы вызывать ее перед каждым из ваших тестов, которые требуют, чтобы действительный пользователь вошел в систему.
Другие советы
Есть другой способ. В моем объекте Пользователь
у меня есть метод login ()
, который помещает идентификатор пользователя в сеанс и статическую переменную. В тесте setUp ()
я просто вызываю $ user- > login ()
, и это работает. В среде тестирования сеансы не используются (настройка Zend_Session :: $ isUnitTested = true
имеет такой эффект), и тесты основаны на статической переменной. Просто не забудьте очистить статическую переменную ( logout ()
пользователя) в tearDown ()
.
Думаю, эта статья поможет вам: http://perevodik.net/en/posts/7/ В нем описывается, как создать поддельную идентификацию, которую можно использовать, чтобы установить для среды состояние, эквивалентное пользователю, вошедшему в систему.
Почти так же, как Паскаль использует эту функцию:
$this->_getLoginFormCSRF();
Я создал универсальную функцию, которая возвращает значение путем загрузки формы с помощью диспетчера элементов формы:
публичная функция _getCSRFHashValueFromForm ($ formAlias, $ csrfName) { $ form = $ this- > servicemanager- > get ('FormElementManager') - > get ($ formAlias); return $ form- > get ($ csrfName) - > getValue (); } Р>
Это, конечно, предполагает, что CSRF привязан к форме, а не к какому-либо набору полей и т. д.