oba*_*lis 6 .net c# tdd stream
我一直试图模拟网络流进行一些单元测试.
到目前为止,使用Moq我得到的最好的是使用流的包装器然后模拟我的界面.
public interface INetworkstreamWrapper
{
int Read(byte[] buffer, int offset,int size);
void Flush();
bool DataAvailable { get; }
bool CanRead { get; }
void close();
}
Run Code Online (Sandbox Code Playgroud)
问题是,虽然这给了我一个开始,但实际上我想测试一些字节数组值作为读入我的读缓冲区.在模拟对象上调用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]);
}
Run Code Online (Sandbox Code Playgroud)
但我建议您重新考虑这种嘲笑的策略,请参阅: http ://davesquared.net/2011/04/dont-mock-types-you-dont-own.html
也许您可以编写一个集成测试,或者使您的代码依赖于抽象 Stream 类。
在您的测试中,您可以使用 MemoryStream 来检查您的类在从流中获取数据时的正确行为。