Я только что начал работу над проектом Symfony2. Инструмент генерации CRUD создал контроллер по умолчанию и функциональный тест, который я изменяю в соответствии с моими потребностями. Редактировать форма генерируется контроллером создает следующий HTML:Symfony2 & phpunit: включить метод переопределения
<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
для запроса PUT) не выполняется.
Это, мой вопрос: при выполнении моих тестов PHPUnit, почему symfony не перезаписывает перезаписанный метод?
Это решение пришло мне на ум, но я попытался его избежать, потому что хочу, чтобы мои функциональные тесты имитировали запросы браузера. Поскольку я не смог придумать более подходящее решение, я реализую его таким образом. – Martijn