2012-09-28 44 views
4

我使用單元測試在Silex中創建應用程序。使用Symfony的flashBag會話進行單元測試

運行單元測試工作正常,對常會處理程序:

$app->register(new Silex\Provider\SessionServiceProvider(), array(
    'session.storage.options' => array(
     'cookie_lifetime' => 1209600, // 2 weeks 
    ), 
)); 

,並設置該標誌在我的單元測試:

$this->app['session.test'] = true; 

如果我不設置session.test標誌,我的單元測試會拋出頭文件已經發送錯誤,並且全部失敗。有了它,我的測試運行良好。

的問題,我嘗試使用flashBag功能(會話信息只持續,直到第一個請求,然後遭到移除):

$foo = $app['session']->getFlashBag()->all(); 

似乎是flashBag不尊重session.test標誌,並嘗試發送頭,導致我所有的單元測試失敗:

24) Yumilicious \單元測試\驗證\ PersonAccountTest :: setConstraintsPassesWithMinimumAttributes 的RuntimeException:無法啓動,因爲頭公頃會議ve 已經發送。

/webroot/yumilicious/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php:142 /根目錄/ yumilicious /供應商/ symfony的/ HTTP的基礎/ Symfony的/組件/ HttpFoundation/Session/Storage/NativeSessionStorage.php:262 /webroot/yumilicious/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Session.php:240 /webroot/yumilicious/vendor/symfony/http- foundation/Symfony/Component/HttpFoundation/Session/Session.php:250 /webroot/yumilicious/src/app.php:38 /webroot/yumilicious/tests/Yumilicious/UnitTests/Base.php:/webroot/yumilicious /vendor/silex/silex/src/Silex/WebTestCase.php:34 /webroot/y umilicious /供應商/ EHER/PHPUnit的/ src目錄/ PHPUnit的/ phpunit.php:46 /Webroot公司/ yumilicious /供應商/ EHER/PHPUnit的/ bin中/ PHPUnit的:5

我已經收窄至該位代碼:https://github.com/symfony/symfony/blob/master/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php#L259

具體來說,行262.註釋掉單行允許我的測試正常工作,並通過綠色。

我已經搜索了很久纔得到這個工作,但沒有任何運氣。我認爲這是因爲flashBag的東西是新的(https://github.com/symfony/symfony/blob/master/src/Symfony/Component/HttpFoundation/Session/Session.php#L305),舊的方法已被棄用。

任何關於讓我的單元測試工作的建議是非常棒的。

+0

我面臨同樣的問題config_test.yml

framework: test: ~ session: storage_id: session.storage.mock_file 

集今天在Silex 2.0-dev上。
但堆棧中的答案都沒有辦法。

我想出了一個可能的答案:http://stackoverflow.com/a/34005216/4323472 – Heah

回答

4

測試你需要的MockArraySessionStorage一個實例來代替session.storage服務:

use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage; 

$app['session.storage'] = new MockArraySessionStorage(); 

這是因爲本地一個嘗試通過header這當然無法在測試環境中發送的cookie。

編輯:現在有一個session.test參數,你應該設置爲true。這會自動使會話使用模擬存儲。

0

我遇到類似的問題,今天和臨時補丁來將註釋掉的代碼塊中

\Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage 

start()方法

/* 
    if (ini_get('session.use_cookies') && headers_sent()) { 
     throw new \RuntimeException('Failed to start the session because headers have already been sent.'); 
    } 
    */ 

該解決方案保持測試的「綠色」,並從長相它是應用程序會話功能。

3

我有這個發生過,如果我沒有弄錯我固定由具有通過不同的環境中運行單元測試代碼我,至極有