Каналы Django не запускают базовый тестовый пример
Я пытаюсь протестировать своих потребителей с помощью инфраструктуры тестирования из каналов django, но даже базовый тест, похоже, не работает
Вот как выглядит мой тестовый пример:
from channels import Channel
from channels.test import ChannelTestCase, HttpClient, apply_routes
from rci.consumers import Demultiplexer
from rosbridge.consumers import OtherWebSocketConsumer
class ChannelTestCase(ChannelTestCase):
def test_channel(self):
client = HttpClient()
client.send_and_consume('websocket.connect', '/new/') # <--- here's the error
self.assertIsNone(client.receive())
Это мой маршрут:
http_routing = [
route("http.request", admin.site.urls, path=r"^/admin/", method=r"^$"),
#...and so on
]
channel_routing = [Demultiplexer.as_route(path=r"^/sock/")]
Это мой потребитель:
class Demultiplexer(WebsocketDemultiplexer):
channel_session_user = True
consumers = {
"rosbridge": ROSWebSocketConsumer,
"setting": SettingsConsumer,
}
Это дает мне следующую ошибку:
ОШИБКА: test_ros_channel (robot_configuration_interface.tests.unit.test_channels.ROSChannelTestCase) ---------------------------------------------------------------------- Traceback (последний вызов был последним): Файл "/home/cjds/development/robot_configuration_interface/robot_configuration_interface/tests/unit/test_channels.py", строка 36, в test_ros_channel client.send_and_consume(файл 'websocket.connect', '/new/')"/usr/local/lib/python2.7/dist- пакеты / каналы /test/http.py", строка 94, в файле send_and_consume self.send(канал, контент, текст, путь) Файл"/usr/local/lib/python2.7/dist-packages/channels/test/http.py", строка 79, в send content.setdefault('reply_channel', self.reply_channel) AttributeError: у объекта 'str' нет атрибута 'setdefault'
Я пытаюсь следовать этому уроку здесь:
1 ответ
каналы 1.x
Ты звонишь send_and_consume
с двумя позиционными аргументами, которые приводят к действию в этом вызове (именно поэтому происходит ошибка во время выполнения в этой строке):
# AGAIN this is wrong code this is what is written in the question
# only difference is the naming of the (previously positional) arguments
client.send_and_consume(channel='websocket.connect', content='/new/')
и вот объяснение, почему возникает ошибка:
Тем не менее, реализация send_and_consume
надеется content
быть словарем:
def send_and_consume(self, channel, content={}, text=None, path='/', fail_on_none=True, check_accept=True):
"""
Reproduce full life cycle of the message
"""
self.send(channel, content, text, path)
return self.consume(channel, fail_on_none=fail_on_none, check_accept=check_accept)
Код реализации взят из: https://github.com/django/channels/blob/master/channels/test/http.py
каналы 2.x
См. https://channels.readthedocs.io/en/latest/topics/testing.html, как упомянуто в комментарии Пола Уиппа.