如何在PHP中单元测试会话变量?

Ann*_* B. 6 php session unit-testing

我通过命令行运行我的单元测试,它工作正常.

但问题是当我测试一个包含读取会话变量的代码的函数时,我得到一个值null.

我的猜测是,当你不在浏览器中时,你无法访问会话变量.

我怎么能用PHP做到这一点?这可能吗?

顺便说一句,我使用CodeIgniter 1.7.2和CIUnit v0.17

任何建议或评论对我来说都是一个很大的帮助..

谢谢

Pau*_*aul 10

菲尔建议我使用课程进行会话.如果手动调用session_start(),则会将代码绑定到PHP会话实现.我对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.');
     }
  }
Run Code Online (Sandbox Code Playgroud)

编辑:

上面的代码将进入你的会话类(可能由它的构造函数以某种方式调用).命令行PHP创建一个数组而不是调用session_start(它在命令行上不起作用).

在测试依赖于会话变量的代码时,我在我的测试中模拟了会话变量:

$_SESSION = array('key1' => 'value you want', 'key2' => 'etc.');
Run Code Online (Sandbox Code Playgroud)

这允许您测试将在页面上收到的所有可能的会话设置.

在我看来,测试会话值的创建属于创建它们的代码,因此嘲笑它们的存在对我来说似乎没问题.这样,您可以单独测试每个单元,而不是将它们组合在一起并在测试之间保持会话值.