2014-09-04 63 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