Каков лучший способ создать функциональные испытания для тестирования форм с защитой CSRF, включенной в Symfony?
В настоящее время я должен добавить следующий код перед каждой формой submittion:
$form = new sfGuardFormSignin();
$token = $form->getCSRFToken();
$token_name = $form->getCSRFFieldName();
Тогда я добавляю $token и $token_name для формирования параметров как это:
call('/login', 'POST', array (
'signin' =>
array (
'username' => $username,
'password' => $password,
$token_name => $token,
)))
Опция предлагается в документации:
'_with_csrf' => true,
Не работает вообще.
Там более простой путь состоит в том, чтобы не добавлять маркер к каждой форме, протестированной вручную? Или существует ли способ выключить csrf, проверяющий при запущении тестов?
Путем я описал выше, в порядке, когда необходимо протестировать 1-2 формы, но если проект содержит десятки уникальные формы, это становится болью.
Конечно, вы не можете использовать параметр _with_csrf, если вы вызываете непосредственно URL-адрес. Вы должны перейти со страницы формы, нажав кнопку отправки. Примерно так:
click('signin', array('signin' => array('username' => $username, 'password' => $password), array('_with_csrf' => true)))
Строка 'signin' должна быть адаптирована к вашей форме. Вы также можете использовать более независимую от ярлыков строку, например 'form # myform input [type = "submit"]' вместо 'signin', адаптируя идентификатор вашей формы.
Как уже было предложено, вы можете отключить CSRF для входа в систему, это действительно полезно для форм, изменяющих данные.
Я лично не использую функциональные тесты так широко (вероятно, в ущерб себе), но вы всегда можете отключить защиту CSRF в своем классе формы для целей тестирования.
public function configure ()
$this->disableLocalCSRFProtection();