В настоящее время у меня есть класс Socket
, который в основном представляет собой класс оболочки OO для функций socket_*
PHP:
class Socket { public function __construct(...) { $this->_resource = socket_create(...); } public function send($data) { socket_send($this->_resource, $data, ...); } ... }
Я не думаю, что могу издеваться над сокетным ресурсом, так как я использую функции сокетов PHP, поэтому прямо сейчас я зациклился на том, как надежно выполнить модульный тест этого класса.
Кажется, что вам не хватает маленькой части для умственного мышления.
Ваша проблема легко разрешима созданием объекта Stub. Как ни странно, я даю этот ответ снова и снова, поэтому его в значительной степени упускают многие люди.
Потому что я вижу так много путаницы в отношении различий между окурками и издевательствами, позвольте мне также изложить это здесь …
^ – Это самое четкое описание двух, которые я когда-либо читал; Я должен положить его на свой сайт.
У сокетов есть эта приятная функция, где вы можете привязываться к порту 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($client, 1024); return $input; } }
Создайте этот объект и настройте его для прослушивания в setUp()
вашего теста и прекратите прослушивание и уничтожьте его в tearDown()
. Затем, в своем тесте, подключитесь к вашему поддельному серверу, верните данные через функцию read()
и проверьте это.
Если это поможет вам много, подумайте о том, чтобы дать мне щедрость для размышлений за пределами традиционной коробки 😉