如何对网络连接进行单元测试?

时间:2011-12-16 12:14:49

标签: .net unit-testing mocking moles pex-and-moles

我想对下面的代码进行单元测试。我一直在使用MSTest,我尝试了解Microsoft MolesRhinoMocks。但我无法让他们都帮助我。我知道我可以彻底改变代码以使用使其更易测试的接口,但它需要我编写封装TcpClient,NetworkStream,StreamWriter和StreamReader的接口和实现。

我已经为此编写了集成测试,我猜有精通鼹鼠的人可以在不改变代码的情况下轻松地进行单元测试。

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();
}

1 个答案:

答案 0 :(得分:11)

保持简单。

摘要离开网络层。我通常使用一个名为INetworkChannel的界面,看起来像这样:

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类。

有关使用哪种流或使用TcpClientSocket的详细信息对应用程序的其余部分无关紧要。

修改

测试INetworkingChannel实现也很容易,因为你现在有一个责任非常明确的课程。我确实创建了与我的实现的连接来测试它们。让TcpListener侦听端口0让操作系统分配一个空闲端口。

我只是确保它正确处理发送和接收,并在连接关闭/断开时进行适当的清理。