2011-07-20 8 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(); 
} 

tearDownAfterClass()のsetUp()とob_end_clean()にob_clean()を追加しました。

まだヘッダーが送信されているというメッセージが表示されます。ファイルにスペースや改行はありません。特定のテストメソッドをコメントアウトすると、完全に動作します。 login()は問題を引き起こしているようです。

誰もがこの/多分コントローラーのユニットテストを違う方法で防止する方法を知っていますか?

おかげで、 MRB

答えて

2

はそれを手に入れました。私はいくつかのYiiファイルをob_start()の前にインクルードしていました。これはヘッダーを印刷したようです。今私はそれもバッファリングします。

+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にアップグレードし、regenerateIDメソッドは1.1.8で追加されたので、今日このエラーが発生しました。

関連する問題