Попытка протестировать операции с файловой системой с помощью VFSStream

Я пытаюсь смоделировать операцию файловой системы (, ну, на самом деле чтение из php ://ввод )с помощью vfsStream, но отсутствие достойной документации и примеров действительно мешает мне.

Соответствующий код из класса, который я тестирую, выглядит следующим образом:

class RequestBody implements iface\request\RequestBody
{
    const
        REQ_PATH    = 'php://input',

    protected
        $requestHandle  = false;

    /**
     * Obtain a handle to the request body
     * 
     * @return resource a file pointer resource on success, or <b>FALSE</b> on error.
     */
    protected function getHandle ()
    {
        if (empty ($this -> requestHandle))
        {
            $this -> requestHandle  = fopen (static::REQ_PATH, 'rb');
        }
        return $this -> requestHandle;
    }
}

Настройка, которую я использую в своем тесте PHPUnit, выглядит следующим образом:

protected function configureMock ()
{
    $mock   = $this -> getMockBuilder ('\gordian\reefknot\http\request\RequestBody');

    $mock   -> setConstructorArgs (array ($this -> getMock ('\gordian\reefknot\http\iface\Request')))
            -> setMethods (array ('getHandle'));


    return $mock;
}

/**
 * Sets up the fixture, for example, opens a network connection.
 * This method is called before a test is executed.
 */
protected function setUp ()
{
    \vfsStreamWrapper::register();
    \vfsStream::setup ('testReqBody');

    $mock   = $this -> configureMock ();
    $this -> object = $mock -> getMock ();

    $this -> object -> expects ($this -> any ())
                    -> method ('getHandle')
                    -> will ($this -> returnCallback (function () {
                        return fopen ('vfs://testReqBody/data', 'rb');
                    }));
}

В реальном тесте (, который вызывает метод, который косвенно запускает getHandle ()), я пытаюсь настроить VFS и запустить утверждение следующим образом:

public function testBodyParsedParsedTrue ()
{
    // Set up virtual data
    $fh     = fopen ('vfs://testReqBody/data', 'w');
    fwrite ($fh, 'test write 42');
    fclose ($fh);
    // Make assertion
    $this -> object -> methodThatTriggersGetHandle ();
    $this -> assertTrue ($this -> object -> methodToBeTested ());
}

Это просто приводит к зависанию теста.

Очевидно, я делаю что-то очень неправильно, но, учитывая состояние документации, я не могу понять, что я должен делать. Это что-то вызвано vfsstream, или phpunit издевается над тем, на что мне нужно смотреть?

8
задан GordonM 28 July 2012 в 10:57
поделиться