2014-09-04 74 views
1

在我的項目中,我有一個類,它檢查本地主機上的所有端口,如果端口是空的則返回true,否則返回false。解決方案是基於this answer暫時鎖定端口進行測試

我需要某種方式來測試它。有沒有辦法暫時使用該端口,然後將其釋放回來?

我試過用TcpListener Start沒有成功。如果我使用TcpClient Connect 我得到System.Net.Sockets.SocketException由於目標機器主動拒絕它127.0.0.1:myPort,因此無法建立連接。

這是我使用的代碼:

class TestPortLocker 
{ 
    public TcpClient client; 
    public TcpListener listener; 

    public void Lock(int port) 
    { 
     client = new TcpClient(); 
     client.Connect("localhost", port); 
     //listener = new TcpListener(port); 
     //listener.Start(); 
    } 

    public void Stop() 
    { 
     client.Close(); 
     //listener.Stop(); 
    } 
} 
+0

什麼你的意思是「我嘗試過使用TcpListener Start沒有成功。」? – usr 2014-09-04 10:01:38

+0

@usr我的代碼顯示該端口是免費的 – kravasb 2014-09-04 10:39:02

+0

那麼,那個代碼有一個錯誤。那個bug可能是什麼? – usr 2014-09-04 11:30:13

回答

1

你可以寫一個單元測試來檢查你的代碼。這裏是你的單元測試方法和測試方法的一個小僞代碼。

假設你有要測試這個類中的方法:

public class PortManager 
{ 
    private _portChecker = portChecker; 
    public PortManager(IPortChecker portChecker) 
    { 
     _portChecker = portChecker; 
    } 

    public bool PortsAreFree(int start, int end) 
    { 
     for(int i = start, i <= end; i++) 
      if(!_portChecker.IsPortOpen(i)) 
       return false; 
     return true; 
    } 
} 

我們測試這個方法,你可以使用一個模擬的IPortChecker:

[TestFixture] 
public class PortManagerTests 
{ 
    [Test] 
    public void PortsAreFree_APortIsLocked_ReturnsFalse() 
    { 
      var mock = new Mock<IPortChecker>(); 
      mock.Setup(x=> x.IsPortOpen(77)).Returns(false); 

      var portManager = new PortManager(mock.Object); 

      Assert.Equal(true, portManager.PortsAreFree(1, 76)); 
      Assert.Equal(true, portManager.PortsAreFree(78, 200)); 
      Assert.Equal(false, portManager.PortsAreFree(1, 200)); 
    } 
} 

}

+0

但是有沒有辦法測試IPortChecker邏輯?我希望它更像集成測試。 – kravasb 2014-09-04 09:53:10

+0

你在被測代碼中究竟做了什麼? – brz 2014-09-04 10:41:46