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之间的差异如此混乱,所以让我把它放在这里,以及......
^ - 这是我读过的两个最清晰的描述; 我应该把它放在我的网站上.
套接字有这个很好的功能,你可以绑定到端口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()功能获取数据,然后进行测试.
如果这对你有很多帮助,可以考虑给我一个在传统方框外思考的赏金;-)