6

コントローラー(Yiiフレームワーク)の単体テストを試みています。

/** 
   * @dataProvider provider
   */
  public function testActionEdit_view_login($controller){
    $user = new CWebUser;
    $user->id = 978;
    $identity = new UserIdentity('me@test.com', '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()に入れ、ob_end_clean()をtearDownAfterClass()に入れます。

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

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

ありがとう、MrB

4

2 に答える 2

4

を呼び出す前に$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 で追加されたため、今日このエラーが発生しました。

于 2012-07-18T03:29:05.250 に答える
2

とった。ob_start() の前にいくつかの Yii ファイルをインクルードしていましたが、ヘッダーが出力されたようです。今、私もそれをバッファリングします。

于 2011-07-20T16:39:35.180 に答える