【问题标题】:HOW to unit test session variables in PHP?如何在 PHP 中对会话变量进行单元测试?
【发布时间】:2011-10-04 04:46:48
【问题描述】:

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

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

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

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

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

任何建议或评论都会对我有很大帮助..

谢谢

【问题讨论】:

  • 我将会话数据访问封装在一个专用类中并在测试中模拟它。
  • CI 会话实际上是 cookie,所以是的,它们在浏览器中工作
  • 感谢 Phil 和 Damien 的回复。@Phil 我该怎么做?很抱歉,我对此完全是菜鸟。如果你觉得可以,我可以问一个例子或程序吗?谢谢
  • 您可以使用 curl 将您的网站作为网页访问(接受 cookie),并在您的网站上创建一些特殊的测试页面,这些页面会根据请求返回您正在测试的会话变量。有点啰嗦,但确实测试了真实的东西

标签: php unit-testing session


【解决方案1】:

按照 Phil 的建议,我使用课程进行课程。如果您手动调用 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.');

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

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

【讨论】:

  • 感谢保罗的回复。这是否意味着我将制作自​​己的会话课程?如何访问已经存在的会话变量?因为我在命令行中获取空值,但在浏览器中获取正确值。我的单元测试是通过命令行运行的。
  • 我会用这些细节填写我的答案。
猜你喜欢
  • 1970-01-01
  • 2018-02-11
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
相关资源
最近更新 更多