Модульное тестирование (PHPUnit):как войти в систему?

StackOverflow https://stackoverflow.com/questions/1808148

  •  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 привязан к форме, а не к какому-либо набору полей и т. д.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top