在phpunit test中为filter_input_array(INPUT_POST)设置$ _POST

yer*_*rgo 12 php phpunit unit-testing global http-post

使用PHPUnit测试我的控制器时遇到一些问题.

到目前为止我正在编写的代码是实现$_POST或其他请求变量:

$_SERVER['REQUEST_METHOD'] = 'POST';
$_POST = array(
    'test' => true
);
Run Code Online (Sandbox Code Playgroud)

大多数测试都以这种方式完美运行,直到我遇到使用filter_input_array函数的方法:

$_SERVER['REQUEST_METHOD'] = 'POST';
$_REQUEST = $_POST = $GLOBALS['_POST'] = array(
    'test' => true
);

// ....

var_dump(filter_input_array(INPUT_POST));
Run Code Online (Sandbox Code Playgroud)

空值

我不愿意filter_input从我的代码中删除函数,但我无法让它们在测试中工作.

版本:
PHP 5.5.9-1ubuntu4.9(cli)(内置:2015年4月17日11:44:57)
Apache/2.4.7(Ubuntu)
PHPUnit 4.6.6作者:Sebastian Bergmann和贡献者.

任何帮助将不胜感激.

编辑2015.05.11

设置$_SERVERCONTENT_LENGTHCONTENT_TYPE没有解决的问题.我的PHP版本不允许我php://stdin按照PHP 5.6.0 chagelog中描述的方式编写(或者我理解它),但是file_put_contents(STDIN,..)成功但无论如何都不起作用.

因为它是一个phpunit测试,也许有一些phpunit.xml我还不知道的注释或条目,可以用php-cgi POST设置方式解决这个问题.

Sco*_*rth 10

如果输入filter_input_array只能由初始请求设置,而不是在运行时更改,那么仍然测试它的唯一方法是通过使用正确的POST数据发出HTTP请求,将基本测试代理放到另一个测试脚本并处理响应.

main_test.php:

<?php
$data = array(
    'testname' => 'yourtestname',
    'some_post_var' => 'some_value'
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://localhost/proxy_test.php");
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);

curl_close($ch);

if ($response == 'pass') {
  // test passed
}
Run Code Online (Sandbox Code Playgroud)

proxy_test.php

<?php
$test_name $_POST['testname']; // what test to run?
$response = run_test($test_name); // run test that uses filter_input_array
if ($response) {
    echo "pass"; // used by main_test.php to check if test passed
} else {
   echo "fail";
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*son 5

看来这是PHP的限制,filter_input_array()不允许$_POST在运行时修改数组.有关更多信息,请参阅此错误.解决方法可能是使用其他过滤器函数之一$_POST自己传入数组.