Parece que le falta una pequeña pieza a la mentalidad de prueba de la unidad.
Su problema se puede solucionar fácilmente creando un objeto Stub. Extrañamente, doy esta respuesta una y otra vez, por lo que debe ser ignorada por muchas personas.
Porque veo tanto confusión en cuanto a las diferencias entre los talones y se burla, déjame ponerlo hacia fuera aquí, así ...
- Una maqueta es una clase que se extiende otra clase que la prueba es directamente dependiente en adelante, para cambiar los comportamientos de esa clase para facilitar las pruebas.
- Un talón de es una clase que implementa una API o interfaz * que una prueba no puede probar fácilmente directamente en su propia, con el fin de hacer las pruebas posible.
^- Esa es la descripción más clara de las dos que he leído; Debería ponerlo en mi sitio.
Los zócalos tienen esta característica agradable en la que puede vincularse al puerto 0 para fines de prueba (en serio, se denomina "puerto efímero").
Así que trate esto:
class ListeningServerStub
{
protected $client;
public function listen()
{
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
// Bind the socket to an address/port
socket_bind($sock, 'localhost', 0) or throw new RuntimeException('Could not bind to address');
// Start listening for connections
socket_listen($sock);
// Accept incoming requests and handle them as child processes.
$this->client = socket_accept($sock);
}
public function read()
{
// Read the input from the client – 1024 bytes
$input = socket_read($client, 1024);
return $input;
}
}
crear este objeto y lo puso a escuchar en su prueba de setUp()
y deje de escuchar y destruirlo en el tearDown()
. Luego, en su prueba, conéctese a su servidor falso, recupere los datos a través de la función read()
y pruebe eso.
Si esto le ayuda mucho, considere darme una recompensa por pensar fuera de la caja tradicional ;-)
Por lo que yo puedo ver las partes omitidas '...' son importantes – KingCrunch
@KingCrunch: Ellos son importantes porque son lo que quiero probar, pero no son importantes para mi pregunta. Debido a que las funciones 'socket_ *' dependen de los recursos del socket (que no se puede burlar de AFAIK), no puedo probar estos métodos de manera confiable. – FtDRbwLXw6
Tengo algunas opiniones sobre el código de red de pruebas unitarias en general, pero no tengo experiencia con PHP. Si no recibes ninguna respuesta en unos días de los desarrolladores de PHP, escribiré algunos comentarios. Sería útil si publicaras algún código que use tu clase de socket, ya que es probable que se tenga en cuenta en mi respuesta. – selbie