Установка $ 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'] содержит.