Ste*_*ant 5 php phpunit unit-testing symfony
我正在为我的应用程序编写单元测试。我编写了一个函数来登录不同的用户(以测试用户级别)和一个函数来生成有效或无效的表单数据(以测试我的表单处理)。
当测试提交表单时,会抛出异常:
Uncaught PHP Exception LogicException: "Cannot set session ID after the session has started."
Run Code Online (Sandbox Code Playgroud)
我正在使用 Symfony 2.6.4。我找不到有关此错误消息的任何有用信息。不久前,该测试运行良好。
class ControllerTest extends WebTestCase
{
public $client = null;
public $route = 'home/';
/**
* @var \Doctrine\ORM\EntityManager
*/
public $em;
public function setUp()
{
self::bootKernel();
$this->client = static::createClient();
$this->em = static::$kernel->getContainer()
->get('doctrine')
->getManager()
;
}
public function logIn($role = 'admin')
{
if ($role === 'admin') {
$userId = 20;
} elseif ($role === 'user') {
$userId = 29;
}
$user = $this->em->getRepository('Acme\DemoBundle\Entity\User')->find($userId);
$session = $this->client->getContainer()->get('session');
$firewall = 'main';
$token = new UsernamePasswordToken($user, $user->getPassword(), $firewall);
$session->set('_security_'.$firewall, serialize($token));
$session->save();
$cookie = new Cookie($session->getName(), $session->getId());
$this->client->getCookieJar()->set($cookie);
}
public function getFormData($valid = true)
{
//function to generate (in)valid formdata
}
public function getFormRequest($data, $url)
{
return $this->client->request(
'POST',
$url,
$data,
[],
[
'CONTENT_TYPE' => 'application/json',
'HTTP_X-Requested-With' => 'XMLHttpRequest',
]
);
}
//works OK
public function testNewScenario()
{
$url = $this->baseurl . 'new';
$this->logIn('admin');
$crawler = $this->client->request('GET', $url);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode(), "Unexpected HTTP status code for GET " . $url);
}
public function testValidNewScenario()
{
$this->logIn('admin');
$validData = $this->getFormData(true);
//this function throws the exception
$this->getFormRequest($validData, $this->baseurl);
$this->assertEquals(200, $this->client->getResponse()->getStatusCode(), "Unexpected HTTP status code for POST " . $this->baseurl);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的 config_test.yml 的相关部分:
framework:
test: ~
session:
storage_id: session.storage.mock_file
profiler:
collect: false
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
我不知道这对OP来说是否仍然是一个问题,因为这是一篇旧帖子,但同样的问题让我在3个小时的大部分时间里一直在兜圈子,试图找到解决办法。而且似乎根本没有任何解决方案。这是一种可能的情况。
该问题存在于尝试创建完整登录的测试中。
当前的 symfony 文档声明它首选在测试中使用basic_http身份验证,但是如果像我一样,您需要测试访问级别,则需要遵循此方法。
当我们尝试设置 cookieJar 时,似乎会出现此问题。这(对我来说)总是抛出错误。
会话启动后无法设置会话 ID
事实证明,解决方案相当简单。将 cookie 设置代码包装在检查当前会话 ID 的条件中。
if( !$this->session->getId() ) {
$this->cookie = new Cookie( $this->session->getName(), $this->session->getId() );
$this->client->getCookieJar()->set( $this->cookie ); // <--- this is the problem line
}
Run Code Online (Sandbox Code Playgroud)
还值得注意的是,调用$this->session->invalidate() 并不能解决问题。
我希望这可以帮助某人并节省他们一些时间。
这对 Symfony2.1 产生了影响(没有升级的机会),但我看到有人提到 2.6 与 FOSFacebookBundle 结合使用时会得到它(我相信问题已经解决)。
| 归档时间: |
|
| 查看次数: |
1580 次 |
| 最近记录: |