Как переопределить ввод php://при выполнении модульных тестов
Я пытаюсь написать unit test для контроллера, используя Zend и PHPUnit
В коде я получаю данные из php://input
$req = new Zend_Controller_Request_Http();
$data = $req->getRawBody();
Мой код отлично работает, когда я тестирую реальное приложение, но если я не могу предоставить данные в качестве необработанного http-сообщения, $data всегда будет пустым. Метод getRawBody() в основном вызывает file_get_contents ('php://input'), но как это сделать, чтобы предоставить тестовые данные в мое приложение.
Ответы
Ответ 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);