2012-02-03 12 views
7

Actualmente tengo una clase Socket, que es básicamente sólo una clase contenedora OO para socket_* funciones de PHP:¿Cómo puedo probar el código del socket con PHPUnit?

class Socket { 
    public function __construct(...) { 
     $this->_resource = socket_create(...); 
    } 

    public function send($data) { 
     socket_send($this->_resource, $data, ...); 
    } 

    ... 
} 

No creo que pueda burlarse del recurso socket ya que estoy usando funciones de sockets de PHP, por lo en este momento estoy atascado en cómo probar de manera confiable esta clase.

+0

Por lo que yo puedo ver las partes omitidas '...' son importantes – KingCrunch

+0

@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

+0

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

Respuesta

16

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

+0

No creo que haya entendido mi pregunta. Tal vez es mi culpa por no ser clara (de ser así, hágame saber cómo puedo modificarla para que sea mejor). El código que quiero probar *** es *** el servidor, por lo que anular el servidor no me ayudaría. Tampoco lo haría el cliente porque, como señalé, incluso el código auxiliar dependería de un recurso externo (muy parecido al código del sistema de archivos de prueba de la unidad). – FtDRbwLXw6

+0

Supongo que para dejarlo más claro: qué sucede si corto el cliente, pero un cortafuegos está bloqueando el tráfico de red en el puerto elegido. O alguna configuración de PHP no permite la apertura del socket. O elegimos un puerto <1024 en un sistema sin raíz. Hay muchas cosas que podrían hacer que las pruebas fallen cuando el código no tiene la culpa, y eso hace que las pruebas no sean confiables. – FtDRbwLXw6

+0

@drrcknlsn Si quieres que la unidad de ayuda pruebe un servidor que no es parte de tu clase Socket, entonces estás ** horriblemente confundido ** en cuanto a lo que trata la Prueba de Unidades. Si desea probar un servidor, simplemente cambie a anotar un cliente (¡obviamente!). Si ninguno de los anteriores, no solo fue la pregunta mala, pero estoy totalmente confundido, ugh. –

Cuestiones relacionadas