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. django unittestでインポートされたクラスを模擬しました
- 2. pytestでモジュールインポートを模擬しました
- 3. 親クラスを模擬して
- 4. 別のクラスから継承したクラスを模擬してください
- 5. 抽象クラスを抽象クラスで模擬しています
- 6. ApiControllerを模擬しました
- 7. WP_REST_Requestオブジェクトを模擬しました
- 8. グローバル変数を模擬しました
- 9. 模擬を使用して同じクラスのインスタンスを模擬してスタブする
- 10. pytestで接続クラスを模擬してください
- 11. .NETコアのHttpContext.Sessionを模擬してください
- 12. .NET 3.5を正しく模擬する方法
- 13. 部分模擬クラス
- 14. IEnumerable <T>を正しく模擬していますか?
- 15. Mockitoメソッドを模擬しますが、模擬返品のパラメータを使用してください
- 16. 単体テストのクラスを模擬して
- 17. サードパーティのクラスを模擬して
- 18. コントローラは模擬した後でもユニットテストを定義していません
- 19. 誰かがxemail-netをC#で使用しましたか?
- 20. 誰もがwinformsアプリケーションで.NETプロバイダモデルを使用できましたか?
- 21. 状態を保存しないで模擬しました
- 22. クラスのメソッド内でコンストラクタを模擬したMockito
- 23. 模擬テスト中のクラスで使用されている別のクラスを模倣しますか?
- 24. Pythonユニットテスト模擬が正しくありません
- 25. Rhinoのモック抽象クラスのデフォルト動作を模擬しました
- 26. 付属のカードでストライプカスタマーサービスを模擬しました
- 27. 春の多くのクラスで共通のクラスインスタンスを模擬してください
- 28. Rhino Mockの模擬クラス
- 29. クラスを模擬する:Mock()かpatch()?
- 30. Rails/Rspecでハッシュを模擬した
"あなたはソケットことを呼んで?" いカウント? =] – mdec