如何使用PHPUnit对套接字代码进行单元测试?

FtD*_*Xw6 8 php sockets phpunit unit-testing

我目前有一个Socket类,它基本上只是PHP socket_*函数的OO包装类:

class Socket {
    public function __construct(...) {
        $this->_resource = socket_create(...);
    }

    public function send($data) {
        socket_send($this->_resource, $data, ...);
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

我不认为我可以模拟套接字资源,因为我使用PHP的套接字函数,所以现在我不知道如何可靠地单元测试这个类.

The*_*ith 16

你似乎错过了单元测试思维的一小部分.

通过创建Stub对象可以轻松解决您的问题.奇怪的是,我一次又一次地给出这个答案,所以很多人都会错过这个答案.

因为我看到存根和嘲differences之间的差异如此混乱,所以让我把它放在这里,以及......

  • mock是一个扩展测试直接依赖的另一个类的类,以便更改该类的行为以使测试更容易.
  • 存根是一个*实现API或接口**的类,测试不能直接自己测试,以便使测试成为可能.

^ - 这是我读过的两个最清晰的描述; 我应该把它放在我的网站上.

套接字有这个很好的功能,你可以绑定到端口0进行测试(严重的是,它被称为"临时端口").

试试这个:

class ListeningServerStub
{
    protected $client;

    public function listen()
    {
        $sock = socket_create(AF_INET, SOCK_STREAM, 0);

        // Bind the socket to an address/port
        socket_bind($sock, 'localhost', 0) or throw new RuntimeException('Could not bind to address');

        // Start listening for connections
        socket_listen($sock);

        // Accept incoming requests and handle them as child processes.
        $this->client = socket_accept($sock);
    }

    public function read()
    {
        // Read the input from the client – 1024 bytes
        $input = socket_read($this->client, 1024);
        return $input;
    }
}
Run Code Online (Sandbox Code Playgroud)

创建此对象并将其设置为在测试中setUp()侦听并停止侦听并在其中销毁它tearDown().然后,在您的测试中,连接到您的虚假服务器,通过该read()功能获取数据,然后进行测试.

如果这对你有很多帮助,可以考虑给我一个在传统方框外思考的赏金;-)

  • 优秀的西奥多,我正在寻找这样的解决方案 (2认同)