Я пытаюсь смоделировать операцию файловой системы (, ну, на самом деле чтение из 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 издевается над тем, на что мне нужно смотреть?