C# で System.net.Sockets.Socket クラスをモックしようとしています - NUnit モックを使用してみましたが、具象クラスをモックできません。Rhino Mocks も使用してみましたが、 Send(byte[]) が呼び出されたときに SocketException がスローされたため、クラスの実際のバージョンを使用しているように見えました。モック フレームワークを使用して Socket モックを正常に作成して使用した人はいますか?
5 に答える
Moq でこの種の問題に遭遇するたびに、モックできないものを抽象化するためのインターフェイスを作成することになります。
したがって、あなたのインスタンスには、Send メソッドを実装する ISocket インターフェイスがあるかもしれません。次に、代わりにモック フレームワークをモックにします。
実際のコードでは、このようなクラスがあります
public class MySocket : ISocket
{
System.Net.Sockets.Socket _socket;
public void MySocket(System.Net.Sockets.Socket theSocket)
{
_socket = theSocket;
}
public virtual void Send(byte[] stuffToSend)
{
_socket.Send(stuffToSend);
}
}
それがあなたのニーズを満たすかどうかはわかりませんが、それはオプションです。
Sendメソッドを呼び出すときにSocketExceptionが発生する理由は、Sendがオーバーライド可能なメソッドではないためです。RhinoMocksがプロパティまたはメソッドの動作をモックできるようにするには、インターフェイスで定義するか(モックオフを作成します)、オーバーライド可能である必要があります。
これに対する唯一の解決策は、モック可能なラッパークラスを作成することです(thinkzigによって提案されています)。
thinkzig が提案するメソッド (Socket のアダプター クラス) を使用して、コンソール アプリケーションの例を作成しました。RhinoMocks と NUnit を使用します。ここからダウンロードできます: System.Net.Sockets.Socket をモックする方法。
thinkzigが言ったように、インターフェイスを作成してテストでモックし、コードにラッパークラスを実装して、すべてのメソッド呼び出しを.NETソケットに転送することをお勧めします。このリンクを見てください、それは同じ問題です:ユニットテストのためにC#でファイルシステムをどのようにモックアウトしますか?