tkuchikiの日記

新ブログ https://blog.tkuchiki.net

Symfony2 で CSRF Validation を ON にした時のテストの書き方

CSRF Validation を 有効にしている時のテストの書き方を調べた。
stackoverflow でそれっぽいものを発見(testing - Get the CSRF token in test - Stack Overflow)。

$crawler = $client->request('GET', '/test');
$extract = $crawler->filter('input[name="HIDDEN_TAG_NAME[_token]"]')
                   ->extract(array('value'));
$csrfToken = $extract[0];

$client->request('POST', '/test', [
    '_token'   => $csrfToken
]);


HIDDEN_TAG_NAME を hidden タグのname 属性に置き換えればOK。
Crawler から Form を生成して submit とかでもいけるのかもしれないが、
以下のようなエラーが出たので client から POSTした。

InvalidArgumentException: The current node list is empty.

ちなみに、stackoverflow で2つ目に回答されている方法だと、弾かれてしまう。
同じ現象が発生した方の記事によると、セッションが違うからダメなのかもしれないということ
(Symfony勉強会 #6 LTの補足 コントローラのテストを短くする試み | karakaram-blog)。