暂时锁定端口以进行测试

时间:2014-09-04 09:19:27

标签: c# port tcpclient tcplistener tcp-ip

在我的项目中,我有一个类检查localhost上的所有端口,如果port是空闲则返回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();
    }
}

1 个答案:

答案 0 :(得分: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));
    }
}

}