2013-03-29 5 views
4

Я только что начал работу над проектом 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 не перезаписывает перезаписанный метод?

ответ

1

Второй аргумент метода form - это метод http. Так что попробуйте это:

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

Это решение пришло мне на ум, но я попытался его избежать, потому что хочу, чтобы мои функциональные тесты имитировали запросы браузера. Поскольку я не смог придумать более подходящее решение, я реализую его таким образом. – Martijn

Смежные вопросы