对Django渠道消费者的测试:;无回复“发送给消费者的U通道”;
我将Django频道与对Django渠道消费者的测试:;无回复“发送给消费者的U通道”;,django,django-testing,django-channels,Django,Django Testing,Django Channels,我将Django频道与@channel\u session\u user装饰器一起使用(用于访问Django的会话数据) 这很好,但在测试时有一个问题 下面的测试应将消息放置在websocket.receive频道上,然后ws_receive应接收消息并将其放置在消息的操作值中定义的频道上。最后,我测试它是否被放在那个频道上 def test_send_chat_message_is_used_by_consumer(self): # Make sure a user is authen
@channel\u session\u user
装饰器一起使用(用于访问Django的会话数据)
这很好,但在测试时有一个问题
下面的测试应将消息放置在websocket.receive
频道上,然后ws_receive
应接收消息并将其放置在消息的操作
值中定义的频道上。最后,我测试它是否被放在那个频道上
def test_send_chat_message_is_used_by_consumer(self):
# Make sure a user is authenticated
self.assertTrue(auth.get_user(self.client).is_authenticated())
payload = {'action': 'chat.receive',
'msg': 'Test message.',
'receiver': self.user2.id}
message = {'text': json.dumps(payload)}
# Send a chat message
Channel('websocket.receive').send(message)
# Receive it and place it on the right channel
ws_receive(self.get_next_message('websocket.receive', require=True))
# Fetch it from the channel
result = self.get_next_message(payload['action'], require=True)
# That should be the message sent
self.assertEqual(result, message)
相反,我得到以下错误,指向带有ws\u receive()
调用的行
ValueError:没有发送给消费者的回复通道@通道_会话只能用于包含它的消息
通道源中的错误
打印reply_频道
将返回None
,而不是包含正确的回复频道名称
tmp = self.get_next_message('websocket.receive', require=True)
print(tmp.reply_channel) # prints: None
我忽略了一些显而易见的事情 我认为你不能简单地给消费者打电话,因为它有decorator
@channel\u session\u user
。您应该尝试使用tests提供的客户端通道
from channels.tests import ChannelTestCase, Client
然后在测试函数中使用类似的内容
client = Client()
client.send('websocket.receive', content=message)
这是因为您提供给“Channel”对象的名称表示接收此消息的频道。检查通道的状态 还要注意tests/base.py文件中的函数。此处的信道参数指的是在测试期间将消息发送到的(应答)信道 回答您的问题- 查看通道/message.py中的。上面说, 消息内容是一个名为.content的dict,而reply_channel是一个可选的额外属性,表示用于回复此消息的最终用户的通道(如果有意义的话) 您需要在发送的dict中设置“回复频道”
message = {
'text': json.dumps(payload),
'reply_channel': 'websocket.receive'
}
希望能有帮助
message = {
'text': json.dumps(payload),
'reply_channel': 'websocket.receive'
}