Mock Networkstream.Read



我一直在尝试模拟某些单元测试的网络流。

到目前为止,我想出的最好的方法就是将包装器用于流,然后模拟我的界面。

public interface INetworkstreamWrapper
{
    int Read(byte[] buffer, int offset,int size);
    void Flush();
    bool DataAvailable { get; }
    bool CanRead { get; }
    void close();
}

问题是,尽管给我一个开始,但我实际上想测试一些字节阵列值,因为读取在我的读取缓冲区中。在模拟对象上调用read()时,如何将一些测试数据返回缓冲区?

您可以使用回调访问传递参数并更改它们:

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

也许您可以改为编写集成测试,或者使您的代码取决于抽象流类。

在您的测试中,您可以使用Memorystream在从流中获取数据时检查类正确的行为。

您可以使用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]);
}

在犀牛中,这很容易,因为网络中的重要方法是虚拟的,因此您可以简单地使用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);

无需包装器。

我对订单的经验很少,但是如果不支持类似的东西,我会感到惊讶。

相关内容

  • 没有找到相关文章

最新更新