6

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

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

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

4

2 回答 2

11

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

/**
 * 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.

于 2010-12-21T13:13:10.270 回答
3

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

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

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

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

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

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

于 2010-12-21T13:25:47.287 回答