会话开始/结束时的单元测试问题

时间:2011-06-06 09:28:49

标签: php unit-testing phpunit

我在为简单的会话包装器编写单元测试时遇到问题。

该类本身具有一些基本功能setgetexists等。 所有这些函数都有一个assertSessionStart检查,它执行以下操作:

protected static function assertStarted()
{
    if (strlen(session_id()) < 1) {
        throw new Exception("Some text here");
    }
    return;
}

编写单位集时,我有以下setUptearDown方法。我有这些因为我希望每个运行的测试都有一个新的会话环境。

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时 - 它告诉我我有一个有效的会话。

有没有人有经验单元测试会话包装器?

其他信息

  1. PHP Version 5.3.6
  2. 的Linux

2 个答案:

答案 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()