2013-03-29 57 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'); 
$form = $crawler->selectButton('Edit')->form(array(
    // ... 
), 'PUT'); 
+0

這個解決方案出現在我的腦海裏,但我試圖避免它,因爲我想要我的功能測試來模擬瀏覽器請求。由於我無法想出更合適的解決方案,因此我將以這種方式實施。 – Martijn