Параметр $ 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 12

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'].