session_regenerate_id() - 已经在单元测试Yii控制器中发送的头文件

时间:2011-07-20 01:29:14

标签: session yii output-buffering

我正在尝试对我的控制器进行单元测试(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

2 个答案:

答案 0 :(得分: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并在1.1.8中添加了regenerateID方法,所以今天我收到了这个错误。

答案 1 :(得分:2)

知道了。我在ob_start()之前包含了一些Yii文件,它们似乎打印了标题。现在我也缓冲它。