2012-11-10 3 views
6

私はいくつかのユニットテストのためにネットワークストリームを模擬しようとしています。Mock Networkstream.Read

これまでのところMoqを使用すると、ストリームのラッパーを使用してインターフェイスをモックすることが最も効果的でした。

public interface INetworkstreamWrapper 
{ 
    int Read(byte[] buffer, int offset,int size); 

    void Flush(); 

    bool DataAvailable { get; } 

    bool CanRead { get; } 

    void close(); 
} 

質問がありますが、これは私には始まりますが、私は実際にはいくつかのバイト配列値を読み込みバッファに読み込みたいと考えています。 mockオブジェクトでRead()を呼び出すときに、バッファにいくつかのテストデータを返すにはどうすればよいですか?

答えて

4

はあなたが渡されたパラメータにアクセスし、それらを変更するコールバックを使用することができます。

public void TestRead() 
{ 
    var streamMock = new Mock<INetworkstreamWrapper>(); 

    streamMock 
      .Setup(m => m.Read(It.IsAny<byte[]>(), 
           It.IsAny<int>(), 
           It.IsAny<int>())) 
      .Callback((byte[] buffer, int offset, int size) => buffer[0] = 128); 

    var myBuffer = new byte[10]; 
    streamMock.Object.Read(myBuffer,0,10); 

    Assert.AreEqual(128, myBuffer[0]); 
} 

をしかし、私はあなたがあなたの戦略を再考を示唆しています http://davesquared.net/2011/04/dont-mock-types-you-dont-own.html

おそらく、あなたは代わりに統合テストを書くことができますかmakあなたのコードは、抽象ストリームクラスに依存します。

あなたのテストでは、Streamからデータをフェッチする際に、MemoryStreamを使用してクラスの正しい動作をチェックできます。

+0

あなたの答えをありがとう。面白い記事。 – obaylis

4

あなたがこれを行うにはSetupを使用することができます。

[Test] 
public void MockStreamTest() 
{ 
    var mock = new Mock<INetworkstreamWrapper>(); 
    int returnValue = 1; 
    mock.Setup(x => x.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>())) 
        .Returns((byte[] r,int o, int s) => 
            { 
             r[0] = 1; 
             return returnValue; 
            }); 
    var bytes = new byte[1024]; 
    var read = mock.Object.Read(bytes , 1, 1); 
    //Verify the the method was called with expected arguments like this: 
    mock.Verify(x => x.Read(bytes, 1, 1), Times.Once()); 
    Assert.AreEqual(returnValue, read); 
    Assert.AreEqual(1,bytes[0]); 
} 
+0

私がしたいことは、Read()を呼び出すときにバイト配列をバッファに返すように模擬networkStreamを設定することでした。そうすれば、既知のバイト配列結果に対して自分のコードをテストできます。あなたの回答から私は戻り値を設定していますか? – obaylis

+0

私の回答を更新 –

0

Rhinomocksでは、これは非常に簡単です.NetworkStreamの重要なメソッドは仮想なので、MockRepositoryを使用してスタブを作成するだけです。さらに良いことに、それは、Readメソッドに渡されたバイト配列は出力配列であることを理解し、あなたは完全にこのコードを使用して)(読むの呼び出しをスタブアウトすることができます

NetworkStream stream = MockRepository.GenerateStub<NetworkStream>(); 
stream.Stub(x => x.Read(Arg<byte[]>.Out(bytes).Dummy, Arg<int>.Is.Anything, Arg<int>.Is.Anything)) 
     .Return(bytes.Length); 

不要ラッパー。

私はMoqの経験がほとんどありませんでしたが、それが似たようなものをサポートしていなければ驚くでしょう。