如何单元测试会话包装类?

时间:2011-10-04 09:05:15

标签: php unit-testing testing

我有简单的会话包装器类,带有getter和setter来处理OO样式的$ _SESSION。 {_ 1}}在__constructor()中调用。对这门课程进行单元测试的最佳做法是什么?

  1. 当我们从CLI运行单元测试时 - 我们无法真正创建会话,但我们可以在测试设置或测试中的任何其他位置定义$ _SESSION变量。模拟Web会话的最佳做法是什么?也许我应该创建某种测试环境,并设置所有服务器变量?

  2. PHPUnit_Framework_Error_Warning:E_WARNING:session_start():无法发送会话cookie - 已经发送的标头(输出从C:\ Users \ Kir \ AppData \ Local \ Temp \ phpunit_go_Kir.php:770开始) - 如何避免这个?如何防止PHP单元测试输出session_start()

  3. PS:很抱歉有问题,但我昨天才开始编写单元测试,目前我没有足够的经验。

    谢谢。

1 个答案:

答案 0 :(得分:0)

在代码中调用session_start会将您绑定到PHP的session_start实现。实际上,会话的想法在CLI中没有意义。您可以使用类中的以下代码保护您的session_start调用:

  if (!isset($_SESSION))
  {
     // If we are run from the command line interface then we do not care
     // about headers sent using the session_start.
     if (PHP_SAPI === 'cli')
     {
        $_SESSION = array();
     }
     elseif (!headers_sent())
     {
        if (!session_start())
        {
           throw new Exception(__METHOD__ . 'session_start failed.');
        }
     }
     else
     {
        throw new Exception(__METHOD__ . 'Session started after headers sent.');
     }
  }

我保持我的会话类只是这个代码(加上一个简单的session_id id函数)。 CLI中的测试可以继续,因为已经防范了session_start调用。实际上测试我粘贴的代码很难。您可以通过在正常CLI测试之外的浏览器下观察来测试它。至少所有其他CLI测试现在都不受session_start调用的影响。