Как проверить ответ успешной формы, отправьте ее в тесте докладчика с помощью Nette Tester

Я хочу проверить действие входа в докладчик с отправкой формы и правильным ответом в перенаправлении. Например. Я хочу проверить, что после правильного входа в систему пользователь перенаправляется куда-то и отображается флеш-сообщение с текстом «вход выполнен успешно».

Во всех примерах единственный способ проверить правильность поведения формы — это проверить, что я получаю 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 инструмент для получения ответа, но важная часть — работа с этим ответом, поэтому не имеет значения, получаете ли вы его нативным способом или с помощью этого инструмента.

1

Решение

Нет, это невозможно, потому что Нетт использует сессию для хранения флеш-сообщений. У вас нет сессии на консоли. Но вы можете использовать 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;
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]