3

Django Channelsとデコレータを使用@channel_session_userしています (Django のセッション データにアクセスするため)。

@channel_session_user_from_http
def ws_connect(message):
    # creates group names like "group-1"
    group_kw = get_group_id_for_user(message.user)
    Group(group_kw).add(message.reply_channel)

@channel_session_user
def ws_receive(message):
    group_kw = get_group_id_for_user(message.user)
    payload = json.loads(message.content['text'])
    Channel(payload['action']).send(message.content)

@channel_session_user
def ws_disconnect(message):
    group_kw = get_group_id_for_user(message.user)
    Group(group_kw).discard(message.reply_channel)

これで問題なく動作しますが、テスト時に問題が発生します。

以下のテストでは、websocket.receiveチャネルにws_receiveメッセージを配置し、メッセージを取得して、メッセージのaction値で定義されたチャネルに配置する必要があります。最後に、実際にそのチャネルに配置されたかどうかをテストします。

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_receive()ます。

ValueError: 消費者に送信された reply_channel がありません。@channel_session は、それを含むメッセージでのみ使用できます。

Channelsソースでエラーが発生します。

正しい返信チャネル名を含める代わりに、reply_channel返品を印刷します。None

tmp = self.get_next_message('websocket.receive', require=True)
print(tmp.reply_channel)  # prints: None

私は明らかな何かを見落としていますか?

4

2 に答える 2

1

デコレータがあるため、単純にコンシューマを呼び出すことはできないと思います@channel_session_user。Client channels.tests が提供するものを使用してみてください。

from channels.tests import ChannelTestCase, Client

次に、テスト関数内でこのようなものを使用します

client = Client()
client.send('websocket.receive', content=message)
于 2016-10-19T03:59:05.773 に答える