2015-01-19 2 views
3

У меня есть форма, без действий (отправляется с javascript), и я пытаюсь написать для нее единичный тест, но он терпит неудачу, потому что отсутствует атрибут действия:тесты модуля symfony: добавление/изменение формы действие

InvalidArgumentException: Текущий URI должен быть абсолютным URL ("").

Есть ли способ добавить его в модульные тесты или изменить содержимое html с помощью искателя?

<form id="form_search_page"> 
    <input type="text" name="keyword" value="" /> 
    <button type="submit" name="searchBtn" id="searchBtn">Search</button> 
</form> 


$client = $this->makeClient(true); 
$url = $this->createRoute("page_index")); 
$crawler = $client->request('GET', $url); 
$response = $client->getResponse(); 

$form = $crawler->filter('#form_search_page')->form(); 
$params = array(
    "form[text]" => "dummy title" 
); 
$form->setValues($params); 
$crawler = $client->submit($form); 
$response = $client->getResponse(); 
$this->assertGreaterThan(0, $crawler->filter('.pages li')->count()); 

ответ

3

Я нашел решение:

$crawler 
    ->filter('form#form_search_page') 
    ->reduce(function (Crawler $form) use ($router) { 
     $url = $router->generate('search_page', array(), true); 

     $node = $form->getNode(0); 
     if (!$node->hasAttribute('action')){ 
      $node->setAttribute('action', $url); 
      $node->setAttribute('method', 'POST'); 
      return true; 
     } 
     return false; 
    }) 
    ->first(); 
2

Вы можете проверить форму POST Ajax представить в качестве примера выше (Допуская форму с маркером CSRF):

$crawler = $this->client->request('GET', $url); 

// retrieves the form token 
$token = $crawler->filter('[name="myform[_token]"]')->attr("value"); 

$posturl = $this->client->getContainer()->get('router')->generate("the-url-of-the-submit"); 
// makes the POST request 
$crawler = $this->client->request('POST', $posturl, array(
    'myform' => array(
     '_token' => $token 
    )), 
    array(), 
    array(
     'HTTP_X-Requested-With' => 'XMLHttpRequest', 
    ) 
); 

$this->assertTrue(
    $this->client->getResponse()->headers->contains(
     'Content-Type', 
     'application/json' 
    ) 
); 

Надежда эта помощь

+1

Спасибо за ваш отзыв, я исправил его после моей первой идеи, манипулировал html с помощью искателя –

+0

Привет @CristianBujoreanu i f этот или любой ответ решил ваш вопрос, пожалуйста, рассмотрите [его принятие] (http://meta.stackexchange.com/q/5234/179419) и/или повысьте, щелкнув галочку. Это указывает более широкому сообществу, что вы нашли решение и дали некоторую репутацию как самому, так и самому себе. Это не обязательно. – Matteo

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