0

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

任何人都知道为什么会发生这种情况以及如何解决它?

4

1 回答 1

1

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

于 2013-04-30T18:42:14.167 回答