Intereting Posts
Подсчитайте данные в массиве, где дата одинакова и постройте диаграмму bar morrisjs Как удалить элементы массива из другого массива? Загрузка файла PHP: подтверждение на mime или расширение? Органы управления Symfony Создание многомерного вложенного массива из результата MySQL с повторяющимися значениями (PHP) В PHP задана строка месяца, такая как «Ноябрь», как я могу вернуть 11 без использования инструкции 12-разрядного переключателя? отправлять почту с помощью mail () в php Что такое инкапсуляция с простым примером в php? Как сжать сообщение об ошибке из PDO? Извлечь схему и хост из HTTP_REFERER Как получить текущее время / часовой пояс пользователя, посетившего мой сайт? Лучшее решение для создания константы класса PHP из выражения? Как я могу использовать in_array, если игла представляет собой массив? openssl_verify (): указанный ключевой параметр не может быть принудительно введен в открытый ключ для файла .pem Правило перезаписи Nginx для CodeIgniter

Как выполнить модульный код сокета с помощью PHPUnit?

В настоящее время у меня есть класс Socket , который в основном представляет собой класс оболочки OO для функций socket_* PHP:

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

Я не думаю, что могу издеваться над сокетным ресурсом, так как я использую функции сокетов PHP, поэтому прямо сейчас я зациклился на том, как надежно выполнить модульный тест этого класса.

Кажется, что вам не хватает маленькой части для умственного мышления.

Ваша проблема легко разрешима созданием объекта Stub. Как ни странно, я даю этот ответ снова и снова, поэтому его в значительной степени упускают многие люди.

Потому что я вижу так много путаницы в отношении различий между окурками и издевательствами, позвольте мне также изложить это здесь …

  • Макет – это класс, который расширяет другой класс , на который непосредственно зависит тест, чтобы изменить поведение этого класса, чтобы упростить тестирование .
  • Штук – это класс, который реализует 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($client, 1024); return $input; } } 

Создайте этот объект и настройте его для прослушивания в setUp() вашего теста и прекратите прослушивание и уничтожьте его в tearDown() . Затем, в своем тесте, подключитесь к вашему поддельному серверу, верните данные через функцию read() и проверьте это.

Если это поможет вам много, подумайте о том, чтобы дать мне щедрость для размышлений за пределами традиционной коробки 😉