2011-12-16 121 views
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(); 
} 
+3

有些事情只是不值得尝试“单元测试”。如果你嘲笑这个方法使用的部分,你基本上会检查一个属性setter,一个调用`writer`的方法和一个调用`reader`的方法。这里没有太多的行为,测试也不是非常有趣。现在测试使用这个方法的类会很有趣,所以我完全让这个类实现一个接口,并测试调用它的组件。 – 2011-12-16 12:33:34

+0

@ MerlynMorgan-Graham我同意 – 2011-12-16 12:37:17

回答

10

保持简单。

摘掉网络层。我通常使用所谓的像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它采用了新的异步方法。

诸如使用什么流或者如果您使用TcpClientSocket这些细节与应用程序的其余部分无关。

编辑

测试的INetworkingChannel实现是一件容易的事,因为你现在得到的一类具有非常明确的责任。我创建了一个连接到我的实现来测试它们。让TcpListener监听端口0以让操作系统分配空闲端口。

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