Sto provando a prendere in giro un'operazione di filesystem (beh, in realtà una lettura da php: // input) con vfsStream ma la mancanza di documentazione ed esempi decenti mi sta davvero ostacolando.Provare a testare le operazioni del filesystem con VFSStream
Il relativo codice dalla classe Sono test è la seguente:
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 messa a punto che sto utilizzando nel mio test PHPUnit è la seguente:
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');
}));
}
In una prova reale (che chiama un metodo che innesca indirettamente getHandle()) io cerco di impostare il VFS ed eseguire un'affermazione come segue:
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());
}
Ciò causa solo il blocco del test.
Ovviamente sto facendo qualcosa di molto sbagliato qui, ma dato lo stato della documentazione non sono in grado di capire cosa si debba fare. Questo è qualcosa causato da vfsstream, o è phpunit che deride la cosa che devo guardare qui?
VFSStream è inutile complesso pezzo di kit con tutte le sottoclassi e spazi dei nomi, ecc Il tutto deve essere un approccio di classe. È un involucro per un involucro. Ho scritto solo una classe basata sull'interfaccia php StreamWrapper e questo è sufficiente per completare il lavoro. Vedi anche: http://php.net/manual/en/class.streamwrapper.php – Codebeat