我正在尝试对我的控制器进行单元测试(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
答案 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文件,它们似乎打印了标题。现在我也缓冲它。