как переопределить ввод php: // при выполнении модульных тестов - PullRequest
19 голосов
/ 11 июля 2010

Я пытаюсь написать модульный тест для контроллера с использованием Zend и PHPUnit

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

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

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

Ответы [ 4 ]

10 голосов
/ 24 марта 2011

У меня была такая же проблема, и способ, которым я ее исправил, заключался в том, чтобы иметь строку '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);
    }

}

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

<?php
$obj = new Foo();
$obj->_fileIn = 'my_input_data.dat';
assertTrue('foo=bar', $obj->read());
7 голосов
/ 11 июля 2010

Вы можете попробовать издеваться над объектом в своих юнит-тестах.Как то так:

$req = $this->getMock('Zend_Controller_Request_Http', array('getRawBody'));
$req->method('getRawBody')
    ->will($this->returnValue('raw_post_data_to_return'));
3 голосов
/ 11 июля 2010

Если $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();

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

0 голосов
/ 28 октября 2014

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...