symfony unit tests: add/modify form action

I have a form, without action (is submitted with javascript) and I'm trying to write a unit test for it, but it fails because "action" attribute is missing:

InvalidArgumentException : Current URI must be an absolute URL ("").

There is a way to do add it in unit tests or modify the html content using the crawler?

<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());

Answers


You could test a ajax POST form submit as example above (Assuming a form with a CSRF token):

$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'
    )
);

Hope this help


I found the solution:

$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();

Need Your Help

Change global variables from inside class method

python class methods global

When I try to execute the code below, the first_list gets modified while no changes occur to the second one. Is there a way to replace an outside list with a brand new list, or calling list methods...

Editable content of a DIV not working properly

javascript jquery css html

I have draggable objects, and each content of an object can be editable.

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.