Symfony2 功能测试 Unreachable field "_token"
Symfony2 functional test Unreachable field "_token"
我正在使用 Liip functional test bundle.
在 Symfony 中创建一个功能测试
我目前无法提交表单。
我正在尝试使用功能测试添加一个新的 'log'。
如果我尝试通过 UI 添加新日志,我会得到以下请求参数:
'WorkLog' => array(
'submit' => '',
'hours' => '8',
'minutes' => '0',
'note' => 'some text',
'_token' => '4l5oPcdCRzxDKKlJt_RG-B1342X52o0C187ZLLVWre4'
);
但是当测试提交表单时,我得到相同的参数但没有令牌
'WorkLog' => array(
'submit' => '',
'hours' => '8',
'minutes' => '0',
'note' => 'some text'
);
我以为我可以通过将“_token”字段添加到表单请求来解决问题,但是当我 运行 然后再次测试时它给了我一个错误:
InvalidArgumentException: Unreachable field "_token"
功能测试代码:
namespace App\AdminBundle\Tests\Controller;
use Liip\FunctionalTestBundle\Test\WebTestCase;
use Symfony\Bundle\FrameworkBundle\Client;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\BrowserKit\Cookie;
class LogControllerTest extends WebTestCase
{
private $client;
private $em;
private $fixtures;
public function setUp()
{
$this->client = static::makeClient();
$this->em = $this->client->getContainer()->get('doctrine')->getManager();
$this->fixtures = $this->loadFixtures(array(
'App\AdminBundle\DataFixtures\ORM\LoadUserData',
'App\AdminBundle\DataFixtures\ORM\LoadSubscriptionTypesData',
'App\AdminBundle\DataFixtures\ORM\LoadSubscriptionData',
'App\AdminBundle\DataFixtures\ORM\LoadWorkLogData',
))->getReferenceRepository();
}
public function testAddNewLog()
{
$accountId = $this->fixtures->getReference('userAccount')->getId();
// log in with admin account
$this->logIn('adminAccount');
$crawler = $this->client->request('GET', '/admin/worklog/account/'.$accountId.'/add');
$csrfToken = $this->client->getContainer()->get('form.csrf_provider')->generateCsrfToken('post_type');
$form = $crawler->selectButton('WorkLog_submit')->form(array(
'WorkLog' => array(
'hours' => '8',
'minutes' => '0',
'note' => 'some text',
'_token' => $csrfToken
),
), 'POST');
$crawler = $this->client->submit($form);
}
}
我的问题:如何使用令牌提交表单?
我不使用 Liip 功能测试包,但我通常按以下方式使用表单和 _token
:
$crawler = $this->client->request('GET', $url);
// retrieves the form token
$token = $crawler->filter('[name="select_customer[_token]"]')->attr("value");
// makes the POST request
$crawler = $this->client->request('POST', $url, array(
'select_customer' => array(
'_token' => $token,
'customerId' => $customerId,
),
));
希望对您有所帮助。
几个小时我遇到了一个非常相似的问题...
我的方法有点不同。当我寻求帮助时,Whosebug 检测到可能存在重复项,我发现了您的问题。你的问题帮助我回答我们类似的问题。
你正在这样做 :
$form = $crawler->selectButton('WorkLog_submit')->form(array(
'WorkLog' => array(
'hours' => '8',
'minutes' => '0',
'note' => 'some text',
'_token' => $csrfToken
),
), 'POST');
您尝试一步完成。但这是不可能的,因为 Liip 功能包试图用一些神奇的方法设置数组的数组并且它崩溃了。我知道我们必须通过更多步骤来完成它:
我在我的代码中这样使用它(你可以看到我不再使用 Liip bundle):
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class GameControllerTest extends WebTestCase
{
public function testLoadGame(){
$client = static::createClient();
$crawler = $client->request('GET', '/loadGame');
$form = $crawler->selectButton('Load')->form();
$field = $form->get("load[uuid]");
$field->setValue($uuid1[0]);
$form->set($field);
$client->submit($form);
$response = $client->getResponse();
self::assertTrue($response->isRedirect('/game'));
}
}
所以我认为您的问题的解决方案是:
$form = $crawler->selectButton('WorkLog_submit')->form();
//dump($form) //uncomment this line to have a look on the array of array
$fieldToken = $form->get("WorkLog[_token]");
$fieldToken->setValue($csrfToken);
$form->set($fieldToken);
$client->submit($form);
我正在使用 Liip functional test bundle.
在 Symfony 中创建一个功能测试我目前无法提交表单。
我正在尝试使用功能测试添加一个新的 'log'。
如果我尝试通过 UI 添加新日志,我会得到以下请求参数:
'WorkLog' => array(
'submit' => '',
'hours' => '8',
'minutes' => '0',
'note' => 'some text',
'_token' => '4l5oPcdCRzxDKKlJt_RG-B1342X52o0C187ZLLVWre4'
);
但是当测试提交表单时,我得到相同的参数但没有令牌
'WorkLog' => array(
'submit' => '',
'hours' => '8',
'minutes' => '0',
'note' => 'some text'
);
我以为我可以通过将“_token”字段添加到表单请求来解决问题,但是当我 运行 然后再次测试时它给了我一个错误:
InvalidArgumentException: Unreachable field "_token"
功能测试代码:
namespace App\AdminBundle\Tests\Controller;
use Liip\FunctionalTestBundle\Test\WebTestCase;
use Symfony\Bundle\FrameworkBundle\Client;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\BrowserKit\Cookie;
class LogControllerTest extends WebTestCase
{
private $client;
private $em;
private $fixtures;
public function setUp()
{
$this->client = static::makeClient();
$this->em = $this->client->getContainer()->get('doctrine')->getManager();
$this->fixtures = $this->loadFixtures(array(
'App\AdminBundle\DataFixtures\ORM\LoadUserData',
'App\AdminBundle\DataFixtures\ORM\LoadSubscriptionTypesData',
'App\AdminBundle\DataFixtures\ORM\LoadSubscriptionData',
'App\AdminBundle\DataFixtures\ORM\LoadWorkLogData',
))->getReferenceRepository();
}
public function testAddNewLog()
{
$accountId = $this->fixtures->getReference('userAccount')->getId();
// log in with admin account
$this->logIn('adminAccount');
$crawler = $this->client->request('GET', '/admin/worklog/account/'.$accountId.'/add');
$csrfToken = $this->client->getContainer()->get('form.csrf_provider')->generateCsrfToken('post_type');
$form = $crawler->selectButton('WorkLog_submit')->form(array(
'WorkLog' => array(
'hours' => '8',
'minutes' => '0',
'note' => 'some text',
'_token' => $csrfToken
),
), 'POST');
$crawler = $this->client->submit($form);
}
}
我的问题:如何使用令牌提交表单?
我不使用 Liip 功能测试包,但我通常按以下方式使用表单和 _token
:
$crawler = $this->client->request('GET', $url);
// retrieves the form token
$token = $crawler->filter('[name="select_customer[_token]"]')->attr("value");
// makes the POST request
$crawler = $this->client->request('POST', $url, array(
'select_customer' => array(
'_token' => $token,
'customerId' => $customerId,
),
));
希望对您有所帮助。
几个小时我遇到了一个非常相似的问题... 我的方法有点不同。当我寻求帮助时,Whosebug 检测到可能存在重复项,我发现了您的问题。你的问题帮助我回答我们类似的问题。
你正在这样做 :
$form = $crawler->selectButton('WorkLog_submit')->form(array(
'WorkLog' => array(
'hours' => '8',
'minutes' => '0',
'note' => 'some text',
'_token' => $csrfToken
),
), 'POST');
您尝试一步完成。但这是不可能的,因为 Liip 功能包试图用一些神奇的方法设置数组的数组并且它崩溃了。我知道我们必须通过更多步骤来完成它:
我在我的代码中这样使用它(你可以看到我不再使用 Liip bundle):
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class GameControllerTest extends WebTestCase
{
public function testLoadGame(){
$client = static::createClient();
$crawler = $client->request('GET', '/loadGame');
$form = $crawler->selectButton('Load')->form();
$field = $form->get("load[uuid]");
$field->setValue($uuid1[0]);
$form->set($field);
$client->submit($form);
$response = $client->getResponse();
self::assertTrue($response->isRedirect('/game'));
}
}
所以我认为您的问题的解决方案是:
$form = $crawler->selectButton('WorkLog_submit')->form();
//dump($form) //uncomment this line to have a look on the array of array
$fieldToken = $form->get("WorkLog[_token]");
$fieldToken->setValue($csrfToken);
$form->set($fieldToken);
$client->submit($form);