php - 如何在 PHP 中对 session 变量进行单元测试?

标签 php unit-testing session

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

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

我的猜测是当你不在浏览器中时你不能访问 session 变量..

我如何使用 PHP 执行此操作? 这可能吗?

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

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

谢谢

最佳答案

我按照 Phil 的建议使用了类(class)。如果您手动调用 session_start() ,您会将代码绑定(bind)到 PHP session 实现。我对 session_start 的调用受到我的 session 类的保护,具有以下内容:

  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 类(并且可能以某种方式由其构造函数调用)。命令行 PHP 创建一个数组而不是调用 session_start(这在命令行上不起作用)。

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

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

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

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

关于php - 如何在 PHP 中对 session 变量进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7643425/

相关文章:

php - Laravel::创建方法

windows - 在多个 Windows 和 Outlook 版本上测试插件的好方法是什么?

unit-testing - 如何使用 Go 中的测试包进行测试设置

java - 如果浏览器不允许 cookie 怎么办

rest - Django REST 框架 : how to use session-based authentication properly?

php - fatal error : Call to undefined function oci_connect() in Wamp

php - (如何)过滤器/参数可以与 Apigility 中的数据库连接服务一起使用吗?

PHP 通过逗号分隔列表从数组中获取值

unit-testing - 带有Moq的单元测试EF存储库模式

php - 通过 .htaccess 在 PHP 中延长 session 超时