2014-09-23 116 views
2

我试图在Symfony中进行一些功能测试,我目前正面临着会话问题。我执行了一段代码,这似乎正在工作,但没有任何内容存储在我的容器的会话中。Symfony2功能测试会话持久性

我有一个表单设置数据。提交时,它会检查值并将其存储在会话中。然后它重定向到需要存储这些值的另一个页面。

我测试的目的是检查会话。

<?php 

namespace Acme\TestBundle\Tests\Controller; 

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 
use Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage; 
use Symfony\Component\HttpFoundation\Session\Session; 

class FrontControllerTest extends WebTestCase 
{ 
    public function testForm() 
    { 
     $client = static::createClient(); 
     $session = $client->getContainer()->get('session'); 

     $crawler = $client->request('GET', '/setParameters'); 

     $form = $crawler->selectButton('Submit')->form(); 
     $form['myForm[firstname]']->setValue('Ben'); 
     $form['myForm[lastname]']->setValue('H'); 

     $client->submit($form); 

     //I tested and my controller is fully going through the submit handler 
     //which check the values and save it into the session 
     //Things are 100% sure there. Then it redirects to another page which check those values. 

     $values = $client->getContainer()->get('session')->get('parameters'); //NULL 
     $this->assertEquals($values['firstname'], 'Ben'); //false 
     $this->assertEquals($values['lastname'], 'H'); //false 
    } 
} 

其实它根本不工作,好像我不能在会话中存储任何内容并检索它。

有人可以帮我吗?谢谢。

+0

在检查会话之前,我建议你用'$ this-> assertEquals(302,$ client-> getResponse() - > getStatusCode(),“正确的响应代码”)来检查操作的成功与否;' – Matteo 2014-09-23 12:41:13

回答

2

您在测试中使用的容器不是您触发的请求使用的容器。 Symfony为每个请求创建新的容器。所以你不能通过容器直接访问会话。

http://alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests

见一个可能的解决办法是从你的cookies提取会话ID,然后读取你的会话存储会话。

+0

谢谢 !作为功​​能测试的新手,我还希望你的建议是“这样做有意义做我正在做的事情”:-)。 – user3348802 2014-09-23 13:25:36

+0

我的意思是你可以提取将会话数据保存到单独的类中的逻辑,并用单元测试来测试这个类。但是,如果会话处理,表单处理或其他任何更改以及单独的类中的代码不再被调用,那么只有通过功能测试才能认识到这一点。所以从我的角度来看,功能测试非常适合这种情况。 – sebbo 2014-09-23 13:36:23

+0

请将链接中的相关代码添加到blockquote中。 – 2016-09-14 12:28:32