Использование пользовательской оболочки потока в качестве тестовой заглушки для PHP http :// оболочка потока

Я пишу пользовательскую оболочку потока для использования в качестве заглушки в модульных тестах для клиентского класса HTTP, который использует встроенную оболочку потока -в http://.

В частности, мне нужен контроль над значением, возвращаемым в ключе 'wrapper_data'вызовами stream_get_meta_dataв потоках, созданных пользовательской оболочкой потока. К сожалению, документация по пользовательским обёрткам потоков ужасна, а API кажется неинтуитивным.

Какой метод в пользовательской оболочке управляет мета-ответом wrapper_data?

Используя класс внизу, я смог получить следующий результат, только когда я var_dump(stream_get_meta_data($stream));на потоках, созданных с помощью пользовательской оболочки...

array(10) {
  'wrapper_data' =>
  class CustomHttpStreamWrapper#5 (3) {
    public $context =>
    resource(13) of type (stream-context)
    public $position =>
    int(0)
    public $bodyData =>
    string(14) "test body data"
  }
 ...

Но мне нужно уговорить оболочку получить что-то вроде следующего при извлечении метаданных, чтобы я мог протестировать синтаксический анализ клиентским классом данных, возвращаемых реальной оболочкой потока http://...

array(10) {
  'wrapper_data' => Array(
       [0] => HTTP/1.1 200 OK
       [1] => Content-Length: 438
   )
  ...

Вот код, который у меня есть в настоящее время для пользовательской оболочки:

class CustomHttpStreamWrapper {

    public $context;
    public $position = 0;
    public $bodyData = 'test body data';

    public function stream_open($path, $mode, $options, &$opened_path) {
        return true;
    }

    public function stream_read($count) {
        $this->position += strlen($this->bodyData);
        if ($this->position > strlen($this->bodyData)) {
            return false;
        }
        return $this->bodyData;
    }

    public function stream_eof() {
        return $this->position >= strlen($this->bodyData);
    }

    public function stream_stat() {
        return array('wrapper_data' => array('test'));
    }

    public function stream_tell() {
        return $this->position;
    }
}
7
задан rdlowrey 31 July 2012 в 14:03
поделиться