Symfony2& phpunit:启用方法覆盖

时间:2013-03-29 10:45:20

标签: symfony phpunit x-http-method-override

我刚开始使用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执行测试时,我的测试失败,因为状态代码是405而不是预期的302。

通过一些调试我发现响应是MethodNotAllowedHttpException。显然,当通过PHPUnit运行测试时,method overriding(内部将POST请求与_method=PUT param一起映射到PUT请求)不会发生。

那就是说,我的问题是:在执行我的PHPUnit测试时,为什么symfony没有重新认识覆盖的方法?

1 个答案:

答案 0 :(得分:1)

form方法的第二个参数是一个http方法。所以试试这个:

$form = $crawler->selectButton('Edit')->form(array(
    // ...
), 'PUT');