Параметр $ Post для входного массива фильтра(входное сообщение) в помощью PHPUnit тест
Возникли некоторые проблемы с использованием PHPUnit для тестирования моих контроллеров.
Код, над которым я работал до сих пор, реализовывал $_POST
или другие переменные запроса:
$_SERVER['REQUEST_METHOD'] = 'POST';
$_POST = array(
'test' => true
);
Большинство тестов отлично работали таким образом, пока я не столкнулся с методами, использующими функцию filter_input_array
:
$_SERVER['REQUEST_METHOD'] = 'POST';
$_REQUEST = $_POST = $GLOBALS['_POST'] = array(
'test' => true
);
// ....
var_dump(filter_input_array(INPUT_POST));
Я не хочу удалять функцииNULL
filter_input
из не моего кода, но я не могу заставить их работать в тестах.
Любая помощь будет оценена по достоинству.Версии:
РНР 5.5.9-1ubuntu4. 9 (cli) (построен: Апрель 17 2015 11:44:57)
Apache / 2.4.7 (Ubuntu)
PHPUnit 4.6.6 автор Себастьян Бергман и другие авторы.
EDIT 2015.05.11
Установка $_SERVER
с CONTENT_LENGTH
и CONTENT_TYPE
не решает проблему. Моя версия PHP не позволяет мне писать в php://stdin
способом, описанным в PHP 5.6.0 chagelog (или так, как я это понимаю), но file_put_contents(STDIN,..)
успешно, но все равно не работает.
Потому что это phpunit test, возможно, есть какая-то аннотация или запись 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'].