php - 如何对 session 包装类进行单元测试?

标签 php unit-testing testing

我有简单的 session 包装类,带有 getter 和 setter 来处理 OO 风格的 $_SESSION。 session_start() 在 __constructor() 中调用。对此类进行单元测试的最佳做法是什么?

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

  2. PHPUnit_Framework_Error_Warning:E_WARNING:session_start():无法发送 session cookie - header 已发送(输出开始于 C:\Users\Kir\AppData\Local\Temp\phpunit_go_Kir.php:770)- 如何避免这个?如何防止PHP单元测试输出Testing started at 12:59 ...

PS:不好意思提问,我昨天才开始写单元测试,目前经验还不够。

谢谢。

最佳答案

在您的代码中调用 session_start 会将您绑定(bind)到 PHP 的 session_start 实现。实际上, session 的概念在 CLI 中毫无意义。您可以在您的类(class)中使用以下代码保护您的 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 类保留为与这段代码有关(加上一个用于 session_id 的简单 id 函数)。由于已防止 session_start 调用,因此可以继续在 CLI 上进行测试。但实际上测试我粘贴的代码很困难。您可以在正常的 CLI 测试之外通过在浏览器下观察来测试它。至少所有其他 CLI 测试现在都不会受到 session_start 调用的影响。

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

相关文章:

php - 如何使用内部连接从 codeigniter 中的两个表中获取数据

php - 返回目录尝试时,导航菜单 A Href 不起作用?

php - MySql自动停止

javascript - 使用 Jasmine 和 TypeScript 进行单元测试

php - java脚本对象数组通过ajax(jquery)和json到php

unit-testing - 单元测试目录结构

c# - 如果预先知道订阅者,我应该使用观察者模式吗?

testing - 测试时如何嵌套Vue.nextTick?

javascript - 在 Jest 测试中渲染 React 组件返回 undefined

eclipse - 如何在 Tycho SWTBot 测试运行时中使用我的 RCP 应用程序添加插件