2011-10-04 93 views
5

我通过命令行运行我的单元测试,它工作正常。如何在PHP中单元测试会话变量?

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

我的猜测是,你不能访问会话变量时,你是不是在浏览器中。 。

我该怎么用PHP做这件事? 这可能吗?

通过使用笨1.7.2 IM的方式CIUnit v0.17

任何建议或评论将是对我很大的帮助..

感谢

+0

我会将会话数据访问包装在一个专门的类中,并在测试中模拟。 – Phil

+0

CI会话是事实上的饼干,所以是的,他们在浏览器中工作 –

+0

感谢Phil和Damien的回复.. @Phil我该怎么做?所以对不起我完全noob这个..我可以问一个例子或程序,如果它可以与你.. thx –

回答

8

我使用一个类的菲尔建议的会议。如果手动调用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.'); 
    } 
    } 

编辑:

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

当测试代码依赖于会话变量我嘲笑会话变量在我的测试:

$_SESSION = array('key1' => 'value you want', 'key2' => 'etc.'); 

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

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

+0

感谢保罗的答复。这是否意味着我会自己创建会话课程?我如何访问已经存在的会话变量?因为Im在命令行中获得空值,但在浏览器中获取正确的值。我的单元测试是通过命令行运行的。 –

+0

我会用这些细节填写我的答案。 – Paul

+0

非常... –