我正在使用Zend-Framework和PHP-Unit。
我的设置
我有一个HTML格式:
<form method="post" action="/my-module/my-controller/do">
<input type="text" name="var" value="my value" />
<input type="submit" value="sumit" />
</form>
这是等效单位测试:
public function test_myForm ()
{
$this->request->setMethod('POST')->setPost(array(
'var' => 'my value'
));
$this->dispatch('/my-module/my-controller/do');
}
控制器操作如下所示(用于测试目的):
public function doAction ()
{
print_r($_POST);
echo "\n -------------------- \n";
print_r(file_get_contents('php://input'));
echo "\n -------------------- \n";
die;
}
结果
如果我在浏览器上提交表单,我会得到以下结果:
Array ( [var] => my value )
--------------------
var=my+value
--------------------
但是如果进行单元测试,这就是输出:
Array ( [var] => my value )
--------------------
--------------------
我的问题
代码“file_get_contents('php:// input')”返回一个空字符串,我不知道为什么。
对于我正在处理的应用程序,重要的是阅读像“file_get_contents('php:// input')”这样的帖子数据,而不仅仅是使用$ _POST。
任何人都知道为什么会这样,以及如何解决它?
答案 0 :(得分:1)
php://input
是一个只读包装器。 $this->request->setMethod('POST')->setPost(array('var' => 'my value'));
只会写入$_POST
。这种情况下PHP无法以您想要的方式进行测试。另一种方法是使用$HTTP_RAW_POST_DATA
,但这可能需要进行一些配置更改。您也无法使用ZF帮助程序来设置集合中的数据,您需要在测试用例中直接设置它。对于非“多部分/表单数据”数据,您应该能够使用http_build_query对数组进行编码以模拟数据。