单元测试中的file_get_contents('php:// input')为空

时间:2013-04-30 09:49:15

标签: php zend-framework phpunit http-post

我正在使用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。

任何人都知道为什么会这样,以及如何解决它?

1 个答案:

答案 0 :(得分:1)

php://input是一个只读包装器。 $this->request->setMethod('POST')->setPost(array('var' => 'my value'));只会写入$_POST。这种情况下PHP无法以您想要的方式进行测试。另一种方法是使用$HTTP_RAW_POST_DATA,但这可能需要进行一些配置更改。您也无法使用ZF帮助程序来设置集合中的数据,您需要在测试用例中直接设置它。对于非“多部分/表单数据”数据,您应该能够使用http_build_query对数组进行编码以模拟数据。