我刚开始一个 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 运行测试时,方法覆盖(在内部将 POST 请求结合_method=PUT
参数映射到 PUT 请求)不会发生。
也就是说,我的问题是:在执行我的 PHPUnit 测试时,为什么 symfony 不重新识别覆盖的方法?