Sembra che manchi un piccolo tassello alla filosofia del test dell'unità.
Il tuo problema è facilmente risolvibile creando un oggetto Stub. Stranamente, ho dato questa risposta più e più volte, quindi deve essere ampiamente ignorata da molte persone.
Perché vedo tanto confusione per quanto riguarda le differenze tra stub e prende in giro, mi permetta di stenderlo qui, così ...
- un mock è una classe che estende un'altra classe che il test è direttamente dipendente, al fine di modificare i comportamenti di tale classe per semplificare il test.
- Uno stub è una classe che implementa un API o interfaccia * che un test non può verificare facilmente sulla propria, al fine di rendere test possibile.
^- Questa è la descrizione più chiara dei due che abbia mai letto; Dovrei metterlo sul mio sito.
I socket dispongono di questa funzionalità utile in cui è possibile eseguire il binding sulla porta 0 a scopo di test (seriamente, si chiama "porta effimera").
Quindi provare questo:
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;
}
}
creare questo oggetto e impostarlo di ascoltare del tuo test setUp()
e smettere di ascoltare e distruggere nel tearDown()
. Quindi, durante il test, connettersi al proprio server falso, recuperare i dati tramite la funzione read()
e verificarlo.
Se questo ti aiuta molto, in considerazione darmi una taglia per pensare fuori dagli schemi tradizionali ;-)
fonte
2012-02-04 19:28:48
Per quanto posso vedere le parti omesse '' ... sono importanti – KingCrunch
@KingCrunch: Si sono importanti in quanto sono ciò che voglio testare, ma non importanti per la mia domanda. Poiché le funzioni 'socket_ *' dipendono dalle risorse socket (che AFAIK non può essere deriso), non posso testare in modo affidabile questi metodi. – FtDRbwLXw6
Ho alcune opinioni sul codice di rete testing unit in generale, ma non ho esperienza con PHP. Se non ricevi risposte in pochi giorni dagli sviluppatori PHP, scriverò alcuni commenti. Sarebbe utile se hai postato del codice che utilizza la tua classe socket, dato che probabilmente verrà preso in considerazione nella mia risposta. – selbie