我在为简单的会话包装器编写单元测试时遇到问题。
该类本身具有一些基本功能set
,get
,exists
等。
所有这些函数都有一个assertSessionStart
检查,它执行以下操作:
protected static function assertStarted()
{
if (strlen(session_id()) < 1) {
throw new Exception("Some text here");
}
return;
}
编写单位集时,我有以下setUp
和tearDown
方法。我有这些因为我希望每个运行的测试都有一个新的会话环境。
protected function setUp() {
session_start();
}
protected function tearDown() {
session_destroy();
}
现在问题是,当我没有开始会话时,我想要一个尝试使用set
时失败的测试方法。为了做到这一点,我将不得不销毁在setUp
中开始的会话。像这样:
public function testGetWithoutSession() {
session_destroy();
$this->setExpectedException('Exception');
ESL_Session::set('set', 'value');
session_start();
}
然而,这会发出警告“试图破坏未初始化的会话”。当我在echo session_id()
前面放session_destroy
时 - 它告诉我我有一个有效的会话。
有没有人有经验单元测试会话包装器?
其他信息:
答案 0 :(得分:5)
这是因为此时:
session_destroy();
$this->setExpectedException('Exception');
ESL_Session::set('set', 'value'); // HERE <----
session_start(); // This is not called anymore!
有一个例外,session_start();
不再被调用。
我的建议是更改为将tearDown
更改为仅在有活动会话时调用session_destory
。因此,在tearDown
“仅清理,如果必须”。
答案 1 :(得分:0)
如果你有一个很好的会话类包装器,我不建议每次session_id();
使用你的断言。
刚刚放了一个地方
private $started = false;
然后在你的
中protected function setUp() {
session_start();
$this->started=true;
}
因此,您可以根据$ started
执行assertStarted()