6

私はいくつかの単体テストのためにネットワークストリームをモックしようとしてきました。

これまでのところ、Moqを使用するのに最適なのは、ストリームのラッパーを使用してから、インターフェイスをモックすることです。

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

    void Flush();

    bool DataAvailable { get; }

    bool CanRead { get; }

    void close();
}

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

4

3 に答える 3

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]);
}
于 2012-11-10T23:23:00.987 に答える
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を参照してください。

代わりに統合テストを作成するか、コードを抽象Streamクラスに依存させることができます。

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

于 2012-11-11T22:23:01.403 に答える
0

Rhinomocksでは、NetworkStreamの重要なメソッドが仮想であるため、これは非常に簡単です。したがって、MockRepositoryを使用してスタブを簡単に作成できます。さらに良いことに、Readメソッドに渡されるバイト配列が出力配列であることを理解しているため、次のコードを使用して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の使用経験はほとんどありませんが、同様の機能がサポートされていない場合は驚きます。

于 2015-06-15T09:36:29.270 に答える