4

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=PUTPUT リクエストに内部的にマップする) は行われません。

そうは言っても、私の質問は: PHPUnit テストを実行するとき、なぜ symfony は上書きされたメソッドを認識しないのですか?

4

1 に答える 1

1

methodの 2 番目の引数はformhttp メソッドです。だからこれを試してください:

$form = $crawler->selectButton('Edit')->form(array(
    // ...
), 'PUT');
于 2013-04-02T15:01:07.383 に答える