Подтвердить что ты не робот

Как переопределить ввод php://при выполнении модульных тестов

Я пытаюсь написать unit test для контроллера, используя Zend и PHPUnit

В коде я получаю данные из php://input

$req = new Zend_Controller_Request_Http();
$data = $req->getRawBody();

Мой код отлично работает, когда я тестирую реальное приложение, но если я не могу предоставить данные в качестве необработанного http-сообщения, $data всегда будет пустым. Метод getRawBody() в основном вызывает file_get_contents ('php://input'), но как это сделать, чтобы предоставить тестовые данные в мое приложение.

4b9b3361

Ответ 1

Если $req->getRawBody(), как вы говорите, такой же, как file_get_contents('php://input')...

$test = true; /* Set to TRUE when using Unit Tests */

$req = new Zend_Controller_Request_Http();
if( $test )
  $data = file_get_contents( 'testfile.txt' );
else
  $data = $req->getRawBody();

Не идеальное решение, но похожее на то, что я использовал в прошлом при разработке скриптов для обработки писем с большим количеством заказов.

Ответ 2

У меня была та же проблема, и я решил, что она должна иметь строку 'php://input' как переменную, которая может быть установлена ​​во время выполнения. Я знаю, что это не относится непосредственно к этому вопросу, так как это потребует изменения Zend Framework. Но все-таки это может быть полезно кому-то.

Например:

<?php
class Foo {

    public function read() {
        return file_get_contents('php://input');
    } 
}

станет

<?php
class Foo {

    public $_fileIn = 'php://input';

    public function read() {
        return file_get_contents($this->_fileIn);
    }

}

Тогда в моем unit test я могу сделать:

<?php
$obj = new Foo();
$obj->_fileIn = 'my_input_data.dat';
assertTrue('foo=bar', $obj->read());

Ответ 3

Вы можете попытаться насмехаться над объектом в своих модульных тестах. Что-то вроде этого:

$req = $this->getMock('Zend_Controller_Request_Http', array('getRawBody'));
$req->method('getRawBody')
    ->will($this->returnValue('raw_post_data_to_return'));

Ответ 4

Zend_Controller_Request_HttpTestCase содержит методы настройки и получения различных запросов и ответов http.

Например: $req = new Zend_Controller_Request_HttpTestCase; $req->setCookie('cookie', 'TRUE'); $test = $this->controller->cookieAction($req); $this->assertSame($test, TRUE);