Тестирование исходящего HTTP-вызова с помощью сокетов?

#python #django #sockets #asyncsocket #webhooks

#python #django #сокеты #asyncsocket #webhooks

Вопрос:

Я пытаюсь написать модульный тест для обратного вызова webhooks в django. Мое приложение настроено так, что, когда я запускаю немного кода, оно отправляет POST-запрос на выбранный мной URL-адрес — это функциональность, которую я пытаюсь протестировать.

Я хотел бы настроить сокет, который прослушивает этот запрос и сообщает мне, был ли он отправлен или нет. Я предполагаю, что это выглядит примерно так:

 import socket

def webHooksTest(self):
    targetURL = 'http://127.0.0.1:8000'

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind('localhost', 8000)
    s.listen(1)
    s.accept()

    # Code that triggers POST request goes here

    self.assertNotEqual(s.recvd(), None, "WebHooks URL did not receive anything")
  

Как есть, это вообще не сработает, потому что программа зависнет на строке s.accept() и никогда не отправит запрос.

Я совершенно новичок в асинхронном программировании и мог бы воспользоваться некоторыми советами. Изучив документы Python, я совершенно уверен, что один модуль сокета не может этого сделать — мне нужна какая-то асинхронная магия.

Ответ №1:

Библиотека сокетов не может сделать это в одиночку. Взгляните на python twisted. Это должно вам помочь. Хотя я еще не пробовал это с django.