【问题标题】:Unit testing cookies in PHPPHP中的单元测试cookie
【发布时间】:2023-03-31 13:40:02
【问题描述】:

依赖会话/cookie 信息的单元测试功能的默认做法是使用抽象库。但是如果我想编写和单元测试这个抽象库怎么办? PHP setcookiefunction 的文档说 cookie 将在下一个请求时可用。使用命令行工具进行测试,没有“请求”之类的东西。那么如何对正确的 cookie 设置进行单元测试呢?

我想测试我的抽象库是否正确设置了setcookie 函数的所有参数。这些参数将根据某些条件和方法调用来设置。

我能想到的唯一解决方案是使用我不想安装的 runkit 扩展来模拟 setcookie 函数。其他想法?

【问题讨论】:

标签: php unit-testing http cookies setcookie


【解决方案1】:

我找到了另一个非常简单的解决方案:PHP setcookie 函数的类包装器,非常简单,不需要进行单元测试:

/**
 * Wrapper around setcookie function for better testability
 */ 
class Cookiesetter {
  public function setcookie($name, $value = "",  $expire = 0,  $path = "", 
    $domain = "", $secure = false, $httponly = false) {
    return setcookie($name, $value,  $expire, $path, $domain, $secure, $httponly);
  }
}

然后可以模拟setcookie 方法。这有一个额外的好处,我可以实现其他方法,如expireCookie

【讨论】:

  • +1 这正是做事的方式 - 使用模拟和存根删除依赖项,以便您可以单独测试。
  • 我不明白如何使用这个包装类测试$_COOKIE['...'] 中的值?
【解决方案2】:

您可以直接在当前的 $_COOKIE 数组中设置一个值:

<?php
$_COOKIE['test']='hello';
print_r($_COOKIE);
run_tests();

(这也适用于 CLI 模式)。请注意,$_REQUEST 不会因此而更新。

但是,如果您只是尝试操作 cookie 以便随后访问会话,为什么不直接访问会话:

<?php
$_SESSION['auth_user']='root';
run_tests();

但我们在这里讨论的是单元测试——而不是集成测试——这表明代码的结构不是很好。

【讨论】:

  • 当我想测试依赖于 $_COOKIE 中值的行为时,我可以直接设置 $_COOKIE。但我也想测试我的库是否正确设置了其他 cookie 参数,如过期时间和 http-only 标志。
  • 但是感谢您对单元测试与集成测试的评论 - 应该不需要在单元测试中模拟多个请求。一些用于发送正确数据的测试和一些用于处理接收数据的测试是单元测试中更好的风格。所以我模拟请求的初衷是不必要的。
猜你喜欢
  • 2011-11-05
  • 2015-02-09
  • 1970-01-01
  • 2015-11-17
  • 2020-09-03
  • 2017-10-26
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
相关资源
最近更新 更多