2012-09-22 26 views
0

我正在使用SonataAdminBundle和DoctrineORMBundle,假設我有一個Post/Tags關係,其中標籤對於Posts而言是多對多的。使用WebTestCase合併被稱爲表單的Ajax內容

我試圖在郵政窗體上運行功能測試。標籤顯示在郵政表格中拋出一個小部件,其中標籤表單字段來自另一個請求(Ajax調用),並通過Javascript在郵政表單中合併。

很容易依靠Javascript來做到這一點,但是當涉及功能測試 場景,使用WebTestCase類時,我發現很難模擬這種功能。

假設我正在測試Post的Create操作並在我的測試用例上使用此代碼。

public function testCreate() { 
    $client = static::createClient(); 
    $client2 = static::createClient(); 
    //main request. The Post form 
    $crawler = $client->request('GET','/route/to/posts/create'); 
    //second request (The Tag form) simulating the request made via Ajax 
    $crawler2 = $client2->request('GET','/admin/core/append-form-field-element?code=my.bundle.admin.tags); 
} 

上面的代碼的問題是,從上面的代碼我不知道如何將標籤形式合併到郵政形式,所以這樣他們一起提交。 任何想法?

+0

看看貂:http://mink.behat.org/ – AdrienBrault

+0

謝謝。我不知道Mink的存在。這真的是一個強大的工具,但我沒有得到它在我的情況下正常工作(不是因爲貂本身)。 – Thomas

回答

0

最後我發現如何將這兩個請求內容合併在一起。這裏是我使用的代碼:

public function testCreate() { 
    $client = static::createClient(); 
    $client2 = static::createClient(); 
    //main request. The Post form 
    $crawler = $client->request('GET','/route/to/posts/create'); 
    //second request (The Tag form) simulating the request made via Ajax 
    $crawler2 = $client2->request('GET','/admin/core/append-form-field-element?code=my.bundle.admin.tags); 
    //first request's form. This is where we'll merge the content. 
    $form = $crawler->selectButton('submitButton')->form(); 
    //let's say we want to merge each input fields from the second request 
    foreach ($crawler2->filter('input') as $node) { 
     //we use the Crawler\Form::set method with a new InputFormField instance 
     //that uses a DOMNode as parameter 
     $form->set(new InputFormField($node)); 
    } 

    //now we can test if the form has our merged input field from the ajax call 
    $this->assertTrue($form->has('tagName')); 
}