gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:29:55 25 4
gpt4 key购买 nike

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

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

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

...
}

我不认为我可以模拟套接字资源,因为我使用的是 PHP 的套接字函数,所以现在我对如何可靠地对该类进行单元测试感到困惑。

最佳答案

您似乎遗漏了单元测试思维的一小部分。

您的问题很容易通过创建一个 Stub 对象来解决。奇怪的是,我一次又一次地给出这个答案,所以它一定被很多人错过了。

因为我看到关于 stub 和模拟之间的区别太多的混淆,所以让我在这里列出来......

  • mock 是一个扩展另一个类的类,测试直接依赖,以改变该类的行为< strong>使测试更容易。
  • stub 是*实现 API 或接口(interface)**的类,测试本身无法轻松直接对其进行测试,目的是使测试成为可能

^-- 这是我读过的对这两本书最清楚的描述;我应该把它放在我的网站上。

套接字有一个很好的特性,您可以绑定(bind)到端口 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 &#8211; 1024 bytes
$input = socket_read($this->client, 1024);
return $input;
}
}

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

如果这对您有很大帮助,请考虑给我跳出传统框框思考的奖励 ;-)

关于php - 如何使用 PHPUnit 对套接字代码进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9136366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com