Non è un test di unità se sta ascoltando una presa. Avvolgi il client e con un sottile strato e lavora invece con una simulazione. In questo modo puoi falsificare tutti i dati ricevuti che desideri.
E.g. Beffarda presa (esempio semplificato):
Crea un isocket interfaccia con tutti i metodi è necessario scaricare:
public interface ISocket
{
ISocket Accept(int port);
byte[] Receive(int numberOfBytes);
bool Send(byte[] data);
void Disconnect();
bool Connect(string address, int port);
}
Ora creare una classe TCPSocket concreta attuazione isocket:
public class TcpSocket : ISocket
{
private Socket socket;
public TcpSocket()
{
socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
}
// implement all methods of ISocket by delegating to the internal socket
}
Ovunque si farebbe normalmente utilizzare un System.Net.Sockets.Socket, passare invece un ISocket. Quando hai bisogno di un nuovo Socket usa TcpSocket. Se crei socket nel profondo del tuo sistema, potresti voler creare una factory invece di creare un TcpSocket direttamente. Sotto test è possibile quindi passare una diversa implementazione di ISocket (the Mock) (eventualmente creata attraverso la factory). È possibile implementare la propria simulazione creando una seconda implementazione di ISocket chiamata MockSocket che restituisce i dati di test in Receive o si può utilizzare uno degli innumerevoli framework mock per farlo per voi.
public class MockSocket : ISocket
{
private byte[] testData;
public void SetTestData(byte[] data)
{
testData = data;
}
public byte[] Receive(int numberOfBytes)
{
return testData;
}
// you need to implement all members of ISocket ofcourse...
}
Questo potrebbe vedere come un sacco di fatica, ma in tutti, ma i sistemi di giocattoli l'API di confine dovrebbe essere nascosto dietro uno strato sottile non solo per il test, ma anche di rimanere flessibile. Se, ad esempio, si desidera utilizzare una libreria socket più potente invece di System.Net.Socket, è possibile utilizzare TcpSocket senza la necessità di modificare ogni utilizzo di socket nel proprio codice. Questo è anche il motivo per cui programmare un'interfaccia invece di programmare un'implementazione concreta di solito è una buona idea: puoi facilmente cambiare le implementazioni (ma ciò non significa che dovresti creare interfacce per TUTTE le tue classi). Se tutto questo ti confonde, leggi di più su mocking (come qui: http://en.wikipedia.org/wiki/Mock_object)
Penso che devi davvero connetterti alla presa ...? Forse mi manca la tua domanda, ma basta aprire un altro socket, chiamare connect e inviare alcuni dati ...? – Aerik
Questo è esattamente ciò di cui tratta questa domanda: dovrei aprire i socket, o dovrei prendere in giro l'intera interfaccia TCP. Penso che un test corretto non dovrebbe usare una risorsa limitata come l'interfaccia di rete .. o sbaglio. – emesx