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);