2011-07-20 21 views
5

我試圖單元測試我的控制器(Yii框架)。session_regenerate_id() - 已在單元測試中發送的頭文件Yii控制器

/** 
    * @dataProvider provider 
    */ 
    public function testActionEdit_view_login($controller){ 
    $user = new CWebUser; 
    $user->id = 978; 
    $identity = new UserIdentity('[email protected]', '123456'); 
    $user->login($identity); 
    $controller->actionEdit(); 

    $output = ob_get_contents(); 
    assertContains('Add/Change Profile Picture:', $output); 
    assertContains('bio', $output); 
    assertContains('specialties', $output); 
    assertContains('change login', $output); 
    assertContains('New Password', $output); 
    } 

當我做

$user->login($identity); 

才能登錄,我收到以下錯誤:

session_regenerate_id(): Cannot regenerate session id - headers already sent 

我已經試圖把這個之初緩衝輸出該類別:

public static function setUpBeforeClass(){ 
    ob_start(); 
} 

我還將ob_clean()放在setUp()和obD_And_clean()的tearDownAfterClass()中。

我仍然收到標題已經發送的消息。當我註釋掉特定的測試方法時,文件中沒有空格或換行符,它可以很好地工作。 login()似乎會導致問題。

任何人都有想法如何防止這/可能單元測試控制器不同?

感謝, MRB

回答

2

明白了。我在ob_start()之前包含了一些Yii文件,這些文件似乎已經打印了標題。現在我也緩衝了這一點。

+0

你是怎麼找到這些的?我遇到了同樣的問題,但我看不到包含文件的任何地方。 – Hippyjim

3

您的來電$user->login之前,添加以下代碼:

$mockSession = $this->getMock('CHttpSession', array('regenerateID')); 
Yii::app()->setComponent('session', $mockSession); 

這將覆蓋regenerateID法,什麼也不做的方法。

ob_start()添加到引導程序也可以,但是直到所有內容都完成後,PHPUnit纔會有輸出。

使用此方法,您仍然可以看到正在發生的進度。

我從Yii 1.1.7升級到1.1.10,並且在1.1.8中增加了regenerateID方法,所以我今天得到了這個錯誤。