symfony 单元测试:add/modify 表单操作
symfony unit tests: add/modify form action
我有一个没有操作的表单(与 javascript 一起提交),我正在尝试为其编写单元测试,但它失败了,因为缺少 "action" 属性:
InvalidArgumentException : Current URI must be an absolute 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());
您可以测试 ajax POST 表单提交,如上例所示(假设表单带有 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'
)
);
希望对您有所帮助
我找到了解决方案:
$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();
这是最简单的方法:
$client = static::createClient();
$crawler = $client->request('GET', '/contacts');
$buttonCrawlerNode = $crawler->selectButton('submit');
// Select the form that contains this button
$form = $buttonCrawlerNode->form();
// Modify the attribute action
$form->getNode(0)->setAttribute('action', 'new-action-url');
...
我有一个没有操作的表单(与 javascript 一起提交),我正在尝试为其编写单元测试,但它失败了,因为缺少 "action" 属性:
InvalidArgumentException : Current URI must be an absolute 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());
您可以测试 ajax POST 表单提交,如上例所示(假设表单带有 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'
)
);
希望对您有所帮助
我找到了解决方案:
$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();
这是最简单的方法:
$client = static::createClient();
$crawler = $client->request('GET', '/contacts');
$buttonCrawlerNode = $crawler->selectButton('submit');
// Select the form that contains this button
$form = $buttonCrawlerNode->form();
// Modify the attribute action
$form->getNode(0)->setAttribute('action', 'new-action-url');
...