2014-09-23 159 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