4

我想对下面的代码进行单元测试。我一直在使用 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();
}
4

1 回答 1

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使用SslStreamFastNetworkChannel使用新 Async 方法的类。

诸如使用什么流或您是否使用TcpClientSocket对应用程序的其余部分无关紧要等详细信息。

编辑

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

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

于 2011-12-16T12:33:08.057 回答