zend tutorial framework php unit-testing zend-framework phpunit

php - zend framework 3 tutorial



¿Cómo anulo php:// input cuando hago pruebas unitarias? (4)

Estoy tratando de escribir una prueba de unidad para un controlador usando Zend y PHPUnit

En el código obtengo datos de php: // input

$req = new Zend_Controller_Request_Http(); $data = $req->getRawBody();

Mi código funciona bien cuando pruebo la aplicación real, pero a menos que pueda proporcionar datos como una publicación http sin procesar, $ data siempre estará en blanco. El método getRawBody () básicamente llama a file_get_contents (''php: // input''), pero ¿cómo lo invalido para proporcionar los datos de prueba a mi aplicación?


Podrías intentar burlarte del objeto en tus pruebas unitarias. Algo como esto:

$req = $this->getMock(''Zend_Controller_Request_Http'', array(''getRawBody'')); $req->method(''getRawBody'') ->will($this->returnValue(''raw_post_data_to_return''));


Siempre que $req->getRawBody() sea, como usted dice, lo mismo que file_get_contents(''php://input'') ...

$test = true; /* Set to TRUE when using Unit Tests */ $req = new Zend_Controller_Request_Http(); if( $test ) $data = file_get_contents( ''testfile.txt'' ); else $data = $req->getRawBody();

No es una solución perfecta, pero es similar a lo que he usado en el pasado al diseñar scripts para manejar correos electrónicos con gran éxito.


Tuve el mismo problema y la forma en que lo solucioné fue tener la cadena ''php://input'' como una variable que se puede configurar en el tiempo de ejecución. Sé que esto realmente no se aplica directamente a esta pregunta, ya que requeriría modificar el Marco Zend. Pero de todos modos puede ser útil para alguien.

Por ejemplo:

<?php class Foo { public function read() { return file_get_contents(''php://input''); } }

se convertiría

<?php class Foo { public $_fileIn = ''php://input''; public function read() { return file_get_contents($this->_fileIn); } }

Luego en mi prueba de unidad puedo hacer:

<?php $obj = new Foo(); $obj->_fileIn = ''my_input_data.dat''; assertTrue(''foo=bar'', $obj->read());


Zend_Controller_Request_HttpTestCase contiene métodos para configurar y obtener varias solicitudes / respuestas http.

Por ejemplo: $req = new Zend_Controller_Request_HttpTestCase; $req->setCookie(''cookie'', ''TRUE''); $test = $this->controller->cookieAction($req); $this->assertSame($test, TRUE); $req = new Zend_Controller_Request_HttpTestCase; $req->setCookie(''cookie'', ''TRUE''); $test = $this->controller->cookieAction($req); $this->assertSame($test, TRUE);