2011-12-16 40 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以讓操作系統分配空閒端口。

我只是確保它處理正確的發送和接收,並且當連接關閉/斷開時它會進行適當的清理。