Estoy tratando de burlarme de una operación del sistema de archivos (bueno, de hecho, una lectura de la entrada php: //) con vfsStream, pero la falta de documentación decente y ejemplos realmente me está obstaculizando.Intentando probar las operaciones del sistema de archivos con VFSStream
El código relevante de la clase que soy prueba es el siguiente:
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;
}
}
La configuración que estoy usando en mi prueba PHPUnit es el siguiente:
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');
}));
}
En una prueba real (que llama a un método que provoca indirectamente GetHandle()) trato de establecer el VFS y ejecutar una afirmación de la siguiente manera:
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());
}
Esto solo hace que la prueba se cuelgue.
Obviamente estoy haciendo algo muy malo aquí, pero dado el estado de la documentación, no puedo determinar qué es lo que estoy destinado a hacer. ¿Esto es algo causado por vfsstream, o phpunit se burla de lo que necesito ver aquí?
vfsStream es compleja pieza innecesaria de kit con todas las subclases y espacios de nombres, etc. El todo debe ser una enfoque de clase Es un envoltorio para una envoltura. He escrito solo una clase basada en la interfaz de php StreamWrapper y eso es suficiente para hacer el trabajo. Ver también: http://php.net/manual/en/class.streamwrapper.php – Codebeat