对Django渠道消费者的测试:;无回复“发送给消费者的U通道”;

对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

我将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 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'
}