我想对下面的代码进行单元测试。我一直在使用 MSTest 并尝试学习 Microsoft Moles和 RhinoMocks .但我不能让他们两个都帮我。我知道我可以大幅更改代码以使用使其更具可测试性的接口(interface),但这需要我编写封装 TcpClient、NetworkStream、StreamWriter 和 StreamReader 的接口(interface)和实现。
我已经为此编写了集成测试,我想精通痣的人可以很容易地为此进行单元测试,而无需更改代码。
using (TcpClient tcpClient = new TcpClient(hostName, port))
using (NetworkStream stream = tcpClient.GetStream())
using (StreamWriter writer = new StreamWriter(stream))
using (StreamReader reader = new StreamReader(stream))
{
writer.AutoFlush = true;
writer.Write(message);
return reader.ReadLine();
}
最佳答案
把事情简单化。
抽象掉网络层。我通常使用类似于 INetworkChannel
的接口(interface)。看起来像这样:
public interface INetworkChannel : IDisposable
{
void Connect(IPEndPoint remoteEndPoint);
void Send(byte[] buffer, int offset, int count);
public event EventHandler Disconnected;
public event EventHandler<ReceivedEventArgs> Received;
}
它使测试一切变得容易,您可以创建
SecureNetworkChannel
使用 SslStream
的类或 FastNetworkChannel
它使用新的 Async 方法。使用什么流或是否使用
TcpClient
等详细信息或 Socket
与应用程序的其余部分无关。编辑
测试
INetworkingChannel
实现也很容易,因为您现在有了一个职责非常明确的类。我确实创建了与我的实现的连接来测试它们。让 TcpListener
监听端口 0
让操作系统分配一个空闲端口。我只是确保它正确处理发送和接收,并在连接关闭/断开时进行适当的清理。
关于.net - 如何对网络连接进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8534000/