ソケットを聴いている場合は単体テストではありません。 クライアントと薄いレイヤーをラップし、代わりにモックを使用してください。この方法で、受信したすべてのデータを偽造することができます。
など。ソケット(簡略化した例を)モック:
はあなたが必要とするすべてのメソッドとのインタフェースISocketを作成します。
public interface ISocket
{
ISocket Accept(int port);
byte[] Receive(int numberOfBytes);
bool Send(byte[] data);
void Disconnect();
bool Connect(string address, int port);
}
は今ISocketを実装する具象クラスTcpSocketを作成します。
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
}
どこ通常どおりSystem.Net.Sockets.Socketを使用し、代わりにISocketを渡します。 Socketを新規に作成する必要があるときは、TcpSocketを使用します。あなたのシステムのぎざぎざに深くソケットを作成する場合は、TcpSocketを直接新しく作るのではなく、ファクトリを作成したいかもしれません。テストの下では、別の実装のISocket(Mock)を渡すことができます(おそらく工場を通じて作成されます)。あなたは、Receiveでテストデータを返すMockSocketと呼ばれるISocketの2番目の実装を作成することで、独自のモックを実装することができます。または、無数のモックフレームワークを使ってそれを行うことができます。
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...
}
これかもしれないが多くの労力のように見えますが、すべてが、おもちゃのシステムに境界APIは、テストのためだけでなく、柔軟滞在するだけではなく、薄い層の背後に隠されなければなりません。例えば、System.Net.Socketの代わりにもっと強力なソケットライブラリを使いたい場合、TcpSocketはそれを自分のコードでソケットのあらゆる使用を変更することなく使用できるようにすることができます。これはまた、具体的な実装にプログラミングするのではなく、インターフェイスへのプログラミングが良いアイデアである理由です。実装を簡単に切り替えることができます(ただし、すべてのクラスへのインターフェイスを作成する必要はありません)。このようなことがすべて混乱している場合は、嘲笑についてもっと詳しくお読みください(http://en.wikipedia.org/wiki/Mock_object)
あなたは本当にソケットに接続する必要があると思います...?たぶん私はあなたの質問が不足しているだけで、別のソケットを開き、接続を呼び出し、いくつかのデータを送信する...? – Aerik
これはまさにこの質問に関するものです:私はソケットを開くべきですか、あるいは私はTCPインターフェイス全体を模倣すべきですか?私は、適切なテストは、ネットワークインターフェイスのような限られたリソースを使用すべきではないと思います。または間違っています。 – emesx