2015-04-29 44 views
4

我正在爲我的項目的題詞部分創建一個功能測試,如果表單需要進入ajax請求,我需要知道如何測試它,否則服務器將始終返回一個空的題字表單。在功能測試中使用ajax提交表格

貌似提交方法並不需要指定它是否是一個Ajax不像請求方法的請求的參數 - >http://api.symfony.com/2.3/Symfony/Component/HttpKernel/Client.html#method_submit

感謝

UPDATE1

//////////////////////////////////////////////// 
// My functional test looks exactly like this // 
//////////////////////////////////////////////// 
$form = $buttonCrawlerNode->form(array(
    'name'    => 'Fabien', 
    'my_form[subject]' => 'Symfony rocks!', 
)); 
// There is no way here I can tell client to submit using ajax!!!! 
$client->submit($form); 

// Why can't we tell client to submit using ajax??? 
// Like we do here in the request méthod 
$client->request(
    'GET', 
    '/post/hello-world', 
    array(), 
    array(), 
    array('HTTP_X-Requested-With' => 'XMLHttpRequest') 
); 
+0

你能提供你的測試科目和單元測試代碼嗎? –

+0

你可以做一個POST(第一個參數)並將數據作爲數組傳遞(第三個參數)。你在這看到什麼問題? – Matteo

+0

我編輯我的答案,希望這更清楚 – Matteo

回答

7

symfony的Request Object intercept an XmlHttpRequest在請求的頭部。所以,簡單地正確的標題添加到測試類你的要求,因爲例如:

class FooFunctionalTest extends WebTestCase 
{ 
    $client = static::CreateClient(); 
    $url = '/post/hello-world'; 
    // makes the POST request 
    $crawler = $client->request('POST', $url, array(
     'my_form' => array(
      'subject' => 'Symfony rocks!' 
     )), 
     array(), 
     array(
      'HTTP_X-Requested-With' => 'XMLHttpRequest', 
     ) 
    ); 
} 

希望這有助於

+0

我已更新我的帖子,可以通過方法提交添加標題嗎?請看看我的文章的更新1的評論 – smarber

+0

因此,您確認我們不能利用'client-> submit($ form)'來處理cookie和所有內容。 **結論**使用ajax發送表單,客戶端提交方法無法完成,因此我們必須使用經典請求。 Thx Matteo – smarber

+0

@smarber其實你可以利用client-> submit($ form)。看到我的答案。 – Taylan

1

其實有一種方法可以充分利用Client::submit,但你需要的,如果要創建新的客戶實例之後你想做非Ajax請求(現在,請參閱下面的GitHub問題鏈接)。

$client->setServerParameter('HTTP_X-Requested-With', 'XMLHttpRequest'); 
$client->submit($form); 

// The following method doesn't exist yet. 
// @see https://github.com/symfony/symfony/issues/20306 
// If this method gets added then you won't need to create 
// new Client instances for following non-ajax requests, 
// you can just do this: 
// $client->unsetServerParameter('HTTP_X-Requested-With');