2013-04-30 2 views
0

Я использую Zend-Framework и PHP-Unit.file_get_contents ('php: // input') empty in Unit Test


МОЯ УСТАНОВКА

У меня есть HTML форма:

<form method="post" action="/my-module/my-controller/do"> 
    <input type="text" name="var" value="my value" /> 
    <input type="submit" value="sumit" /> 
</form> 

Это эквивалентно тестовый модуль:

public function test_myForm() 
{ 
    $this->request->setMethod('POST')->setPost(array(
     'var' => 'my value' 
    )); 
    $this->dispatch('/my-module/my-controller/do'); 
} 

Действие контроллер выглядит следующим образом (для целей тестирования):

public function doAction() 
{ 
    print_r($_POST); 
    echo "\n -------------------- \n"; 
    print_r(file_get_contents('php://input')); 
    echo "\n -------------------- \n"; 
    die; 
} 

РЕЗУЛЬТАТОВ

Если я отправить форму в браузере я получаю этот результат:

Array ([var] => my value) 
-------------------- 
var=my+value 
-------------------- 

Но если сделать тест на единицу, это выход:

Array ([var] => my value) 
-------------------- 

-------------------- 

МОЙ ВОПРОС

Код "file_get_contents ('php: // input')" возвращает пустую строку, я не знаю почему.

Для приложения, над которым я работаю, важно прочитать данные сообщения, подобные этому «file_get_contents ('php: // input»), а не просто использовать $ _POST.

Любая идея, почему это происходит и как ее решить?

+0

В ajax есть способ отправить запрос полезной нагрузки, описанной здесь (http://stackoverflow.com/questions/9597052/how-to-retrieve-request-payload). Не требуется «application/x-www-form-urlencoded». – BlitZ

ответ

1

php://input является только для чтения оберткой. $this->request->setMethod('POST')->setPost(array('var' => 'my value')); будет писать только $_POST. Это случай, когда PHP не тестируется так, как вы хотите. Альтернативой может быть использование $HTTP_RAW_POST_DATA, но это может потребовать некоторых изменений конфигурации. Вы также не сможете использовать помощники ZF для установки данных в своем наборе, вам нужно будет установить его непосредственно в тестовом примере. Для данных «multipart/form-data» вы должны иметь возможность кодировать массив с помощью http_build_query для имитации данных.

+0

Благодарим вас за объяснение @SamHennessy. Я добавлю исключение в действие, что при выходе из тестовой среды он считывает необходимые данные следующим образом: http_build_query ($ this-> getRequest() -> getPost()); –