Установка $ POST для входного массива фильтра (INPUT POST) в тесте phpunit
проблемы с помощью PHPUnit, чтобы проверить мои контроллеры.
код, над которым я работал до сих пор, реализовывал $_POST
или другие переменные запроса:
$_SERVER['REQUEST_METHOD'] = 'POST';
$_POST = array(
'test' => true
);
большинство тестов работали отлично таким образом, пока я не столкнусь с методами, которые используют :
$_SERVER['REQUEST_METHOD'] = 'POST';
$_REQUEST = $_POST = $GLOBALS['_POST'] = array(
'test' => true
);
// ....
var_dump(filter_input_array(INPUT_POST));
NULL
Я не хочу удалить filter_input
функции из не моего кода, но я не могу заставить их работать в тесты.
Versionings:
PHP 5.5.9-1ubuntu4.9 (cli) (построенный: Apr 17 2015 11:44:57)
Apache / 2.4.7 (Ubuntu)
PHPUnit 4.6.6 Себастьяна Бергмана и авторов.
любая помощь будет оценили.
изменить 2015.05.11
задание $_SERVER
С CONTENT_LENGTH
и CONTENT_TYPE
не устраняет проблему. Моя версия PHP не позволяет мне писать в php://stdin
в пути его описано в PHP 5.6.0 chagelog (или как я понимаю), но file_put_contents(STDIN,..)
успешно, но все равно не работает.
потому что это тест phpunit, возможно, есть какая-то аннотация или phpunit.xml
запись я пока не знаю, что может исправить эту проблему php-cgi POST setting порядке.
3 ответов
Если вход в filter_input_array
может быть установлен только начальным запросом и не изменен во время выполнения, тогда единственный способ проверить его-это иметь базовый тестовый прокси для другого тестового сценария, сделав HTTP-запрос с правильными данными POST и обработав ответ.
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
}
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";
}
похоже, что это ограничение PHP,filter_input_array()
не дает $_POST
массив изменен во время выполнения. См.эта ошибка для получения дополнительной информации. Обходной путь, вероятно, использовать один из другие функции фильтра и передать $_POST
массив себя.
если ни один из аргументов не задан, эта функция возвращает NULL
, not an array of NULL values.
/ / нет POST vars в запросе
$_POST = array();
$args = array('some_post_var' => FILTER_VALIDATE_INT);
$myinputs = filter_input_array(INPUT_POST, $args);
var_dump($myinputs);
Expected Output: array(1) { ["some_post_var"]=> NULL }
фактический выход: NULL
при фильтрации входных массивов будьте осторожны с флагами, которые вы устанавливаете помимо FILTER_REQUIRE_ARRAY
. Например, установка флагов следующим образом:
<?php
$filter = array(
'myInputArr' => array('filter' => FILTER_SANITIZE_STRING,
'flags' => array('FILTER_FLAG_STRIP_LOW', 'FILTER_REQUIRE_ARRAY'))
);
$form_inputs = filter_input_array(INPUT_POST, $filter);
?>
.. приведет к пустому $form_inputs ['myInputArr'] независимо от что $_POST ['myInputArr'] содержит.