C#でSystem.net.Sockets.Socketクラスをモックしようとしています - NUnitモックを使ってみましたが、具体的なクラスをモックできません。私もRhino Mocksを使ってみましたが、Send(byte [])が呼び出されたときにSocketExceptionがスローされたので、クラスの実際のバージョンを使用したようです。誰も正常に作成し、任意の模擬フレームワークを使用してソケットモックを使用していますか?誰もが.NETでSocketクラスをうまく模擬しましたか?
答えて
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);
}
}
のようなクラスを持っていると思いますが、それはオプションです。
送信方法を仮想にすることも考慮する必要があります。 –
呼び出しが良いです。メソッドをバーチャルにするために編集されました。 – JamieGaines
しかし、そこで止まらないでください。外部APIをエコーするのではなく、コードが通信レイヤから望むものを記述するインタフェースを記述します。これは、バイトではなく構造化された入力を受け入れることを意味します。あるいは、それは文脈に依存します。 –
インターフェイスに作成し、テストで模擬し、コード内にラッパークラスを実装し、thinkzigが言ったようにすべてのメソッド呼び出しを.NETソケットに転送する方がよいでしょう。このリンクを見ても同じ問題です:How do you mock out the file system in C# for unit testing?
Sendメソッドを呼び出すと、SocketExceptionが発生するのは、Sendメソッドがオーバーライド可能なメソッドではないからです。 RhinoMockがプロパティやメソッドの動作を疑似できるようにするには、インターフェイスで定義するか(モックオフを作成する)、またはオーバーライドする必要があります。
唯一の解決策は、疑似ラッパークラスを作成することです(thinkzigで提案されているように)。
thinkzigが提案するメソッド(Socketのアダプタクラス)を使用してコンソールアプリケーションのサンプルを作成しました。それはRhinoMocksとNUnitを使用します。ここでダウンロードすることができます:How to mock System.Net.Sockets.Socket。
上記のクラスはあなたの送信方法のみをモックします。これは実際にソケットを模倣します。これはSocketをすべて継承し、ISocketインターフェイスを実装します。 ISocketは、インターフェイスには二つの方法で、このようになります
//internal because only used for test code
internal class SocketWrapper : Socket, ISocket
{
/// <summary>
/// Web Socket
/// </summary>
public SocketWrapper():base(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
{
}
//use all features of base Socket
}
を模擬する必要がある任意のソケットのメソッドやプロパティの署名を実装する必要が減少しました:
public interface ISocket
{
void Connect(IPAddress address, int port);
int Send(byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError errorCode);
}
彼らは2つのコンストラクタを持って使用するクラス。 OneはテストのためにISocketをインジェクトし、次にアプリケーションが使用する独自のソケットを作るためにISocketをインジェクトします。
public class HTTPRequestFactory3
{
internal ISocket _socket;
/// <summary>
/// Creates a socket and sends/receives information. Used for mocking to inject ISocket
/// </summary>
internal HTTPRequestFactory3(ISocket TheSocket)
{
_socket = TheSocket as ISocket;
this.Setup();
}
/// <summary>
/// Self Injects a new Socket.
/// </summary>
public HTTPRequestFactory3()
{
SocketWrapper theSocket = new SocketWrapper();
_socket = theSocket as ISocket;
this.Setup();
}
}
次に、あなたのテストは、期待を設定し、ISocketを作成し、上記のクラスは、実際のソケットが使用するすべて同じコードを実行し、それらを確認することができます。このテストでは、セクションコードが検証されます。
[Test]
public void NewSocketFactoryCreatesSocketDefaultConstructor()
{
webRequestFactory = new HTTPRequestFactory3();
Assert.NotNull(webRequestFactory._socket);
Socket testSocket = webRequestFactory._socket as Socket;
Assert.IsInstanceOf<Socket>(testSocket);
}
- 1. 別のクラスから継承したクラスを模擬してください
- 2. IEnumerable <T>を正しく模擬していますか?
- 3. .NET 3.5を正しく模擬する方法
- 4. サードパーティのクラスを模擬して
- 5. 状態を保存しないで模擬しました
- 6. Rhinoのモック抽象クラスのデフォルト動作を模擬しました
- 7. 誰かがxemail-netをC#で使用しましたか?
- 8. 誰もがwinformsアプリケーションで.NETプロバイダモデルを使用できましたか?
- 9. ユニットテストのためにユーレカ・フェーン・クライアントを模擬しました
- 10. Rhino Mockの模擬クラス
- 11. クラスを模擬する:Mock()かpatch()?
- 12. HttpResponseBase.End()をどうやって模擬しますか?
- 13. IUnityContainerをどうやって模擬しますか?
- 14. PHPUnit:このファイルシステムをどうやって模擬しますか?
- 15. あなたはどのようにasp.net mvcでキャッシュオブジェクトを模擬しますか?
- 16. SIFR 3ベータ:誰もがテキストを正しく整列できましたか?
- 17. Mockitoとのインタフェースを模擬しました
- 18. ファイル操作を模擬したJunitテスト
- 19. RavenDbを模擬して
- 20. Microsoft DLLを模擬して
- 21. Laravel 5.2模擬ファイルアップロードユニットテストに失敗しました
- 22. 誰かがlibsensorsを正しく使用できましたか?
- 23. .NETの非仮想メソッドの模擬/スタブ
- 24. Mapnikの.NETバインディングをコンパイルする人は誰もいませんでしたか?
- 25. オーバーロードされたメソッドを模擬します
- 26. 誰も.NETのSystem.IO.IsolatedStorageを使用していますか?
- 27. Javaコードからsoapui模擬サービスを呼び出しますか?
- 28. asp.net MVCでのユニットテスト、どのように私はページリクエストを模擬しますか?
- 29. AngularJSサービスのジャスミンテストで$ httpをどうやって模擬しますか?
- 30. 誰もがWebアプリケーション用のJODBを経験しましたか?
"あなたはソケットことを呼んで?" いカウント? =] – mdec