Symfony2 プロジェクトを始めたばかりです。CRUD 生成ツールによって、既定のコントローラーと機能テストが作成されました。これをニーズに合わせて変更しています。コントローラーによって生成された編集フォームは、次の HTML を作成します。
<form action="/app_dev.php/invoice/7" method="post" >
<input type="hidden" name="_method" value="PUT" />
<!-- ... -->
</form>
アプリケーションでセマンティック ルートを作成できるため、HTTP メソッドをオーバーライドするアプローチが気に入っています。今、私は以下を使用して、機能テストでこのフォームをテストしようとしています:
$crawler = $client->click($crawler->selectLink('Edit')->link());
$form = $crawler->selectButton('Edit')->form(array(
'_method' => 'PUT',
// ...
));
$client->submit($form);
$this->assertEquals(302, $client->getResponse()->getStatusCode(), "Unexpected HTTP status code for POST /invoice/<id>/edit");
を実行してテストを実行するphpunit -c /app
と、ステータス コードが予想される 302 ではなく 405 であるため、テストが失敗します。
少しデバッグしたところ、 の応答がMethodNotAllowedHttpException
. どうやら、PHPUnit を介してテストを実行すると、メソッドのオーバーライド(POST リクエストを param と組み合わせて_method=PUT
PUT リクエストに内部的にマップする) は行われません。
そうは言っても、私の質問は: PHPUnit テストを実行するとき、なぜ symfony は上書きされたメソッドを認識しないのですか?