Я хочу проверить действие входа в докладчик с отправкой формы и правильным ответом в перенаправлении. Например. Я хочу проверить, что после правильного входа в систему пользователь перенаправляется куда-то и отображается флеш-сообщение с текстом «вход выполнен успешно».
Во всех примерах единственный способ проверить правильность поведения формы — это проверить, что я получаю RedirectResponse (см. Ниже). Разве это не слишком мало? Как сделать тест, который я опишу? Это вообще возможно?
function testSignUpSuccess()
{
$post = [
'identity' => '[email protected]',
'password' => 'superSecret123',
];
$pt = $this->getPresenterTester()
->setPresenter('Sign')
->setAction('up')
->setHandle('signUpForm-submit')
->setPost($post);
$response = $pt->run();
Assert::true($response instanceof Nette\Application\Responses\RedirectResponse);
//TODO test that flashMessage: 'login successful' is displayed on final page
}
Примечание: этот пример использует PresenterTester инструмент для получения ответа, но важная часть — работа с этим ответом, поэтому не имеет значения, получаете ли вы его нативным способом или с помощью этого инструмента.
Нет, это невозможно, потому что Нетт использует сессию для хранения флеш-сообщений. У вас нет сессии на консоли. Но вы можете использовать Tester\DomQuery
проверить, есть ли на странице необходимый контент (например, вошел в систему под именем пользователя).
$dom = Tester\DomQuery::fromHtml($html);
Assert::true( $dom->has('form#registration') );
Assert::true( $dom->has('input[name="username"]') );
Assert::true( $dom->has('input[name="password"]') );
Assert::true( $dom->has('input[type="submit"]') );
Вам, вероятно, потребуется отключить флэш-сообщения в тестах, чтобы избежать ошибок сеанса. Вы можете сделать это в BasePresenter.
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
/**
* @var bool
*/
public $allowFlashMessages = TRUE;
/**
* Saves the message to template, that can be displayed after redirect.
*
* @param string
* @param string
*
* @return \stdClass
*/
public function flashMessage($message, $type = 'info')
{
if ($this->allowFlashMessages) {
return parent::flashMessage($message, $type);
}
}
}
Затем вы можете отключить его в своих тестах.
isset($presenter->allowFlashMessages) && $presenter->allowFlashMessages = FALSE;
Других решений пока нет …