【发布时间】:2009-12-05 18:33:15
【问题描述】:
我正在为 Web 应用程序编写 PHPUnit 测试用例。由于测试是在命令行环境中运行的,我正在模拟一些预定义的变量,例如 $_POST、$_GET、$_SERVER等。我的测试必须确保我的控制器类正确解析 JSON 输入(通过 php://input 作为原始 POST 和红色发送)。问题是,如何在不运行 Web 服务器的情况下操作 php://input 的值?
【问题讨论】:
我正在为 Web 应用程序编写 PHPUnit 测试用例。由于测试是在命令行环境中运行的,我正在模拟一些预定义的变量,例如 $_POST、$_GET、$_SERVER等。我的测试必须确保我的控制器类正确解析 JSON 输入(通过 php://input 作为原始 POST 和红色发送)。问题是,如何在不运行 Web 服务器的情况下操作 php://input 的值?
【问题讨论】:
POST 数据是输入到 PHP 的标准输入的任何内容,取决于 CONTENT_LENGTH 环境变量告诉 PHP 要读取多少字节(因此要更改发布数据,您只需输入不同的管道)
GET 数据是 QUERY_STRING 环境变量中的任何内容。
请参阅this 了解其他可用于设置的环境变量,PHP 使用这些环境变量来填充诸如 $_SERVER 之类的内容
【讨论】:
我会说你没有足够的分离关注点;在我看来,你应该有:
这两种方法中的每一种都只负责一件事;这样,您可以单元-测试。
在您的情况下,您可以对第二种方法(实际工作的方法)的行为进行单元测试——而不取决于输入的来源。
【讨论】:
如何将阅读功能移动到一个类(如果您使用的是 PHP 5.3,甚至是一个闭包),然后在测试时将其替换为模拟实例?
【讨论】: