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和贡献者.
任何帮助将不胜感激.
设置$_SERVER有CONTENT_LENGTH和CONTENT_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)
| 归档时间: |
|
| 查看次数: |
5074 次 |
| 最近记录: |