【问题标题】:Temporarily lock port for testing purposes临时锁定端口以进行测试
【发布时间】:2014-10-28 23:29:51
【问题描述】:

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

【问题讨论】:

  • “我尝试使用 TcpListener 启动没有成功”是什么意思?
  • @usr 我的代码显示端口是空闲的
  • 那么,那段代码有一个错误。那可能是什么错误?
  • @usr 该代码运行良好。当我启动一些使用该端口的应用程序时,代码显示该端口正在使用中。
  • 那你为什么说代码显示“那个端口是空闲的”?你说你“没有成功”。

标签: c# port tcpclient tcplistener tcp-ip


【解决方案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));
    }
}

}

【讨论】:

  • 但是有没有办法测试 IPortChecker 逻辑?我希望它更像集成测试。
  • 您在被测代码中到底在做什么?
猜你喜欢
  • 2019-05-25
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
相关资源
最近更新 更多