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() 似乎导致了问题。

任何人都知道如何防止这种情况/也许对控制器进行不同的单元测试?

谢谢,B先生

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 回答