2016-08-15 2 views
3

Djangoチャンネル@channel_session_userデコレータを使用しています(Djangoのセッションデータにアクセスするため)。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: No reply_channel sent to consumer; @channel_session can only be used on messages containing it.

チャンネルソースでエラーis raised here

reply_channelを印刷すると、正しい返信チャネル名を含む代わりにNoneが返されます。

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

わかりやすいものを見落としていますか?

答えて

1

デコレータ@channel_session_userがあるため、単にコンシューマを呼び出すことはできません。クライアントchannels.testsを使用してみてください。

from channels.tests import ChannelTestCase, Client 

その後、あなたは「チャンネル」オブジェクトに指定する名前は、このメッセージが受信されたチャネルを表すので、これは

client = Client() 
client.send('websocket.receive', content=message) 
0

テスト関数内でこのようなものを使用します。チャンネルのinit functionを確認してください。

また、tests/base.pyファイル内の関数get_next_messageにも注意してください。ここで、チャネルのパラメータは、テスト中にメッセージが送信された(返信)チャネルを示します。あなたの質問に答えるために

-

は、チャンネル/ message.pyにdocstring of Message objectを見てください。それはあなたが送っ辞書で「reply_channel」を設定する必要があり、

The message content is a dict called .content, while reply_channel is an optional extra attribute representing a channel to use to reply to this message's end user, if that makes sense.

を言います。

message = { 
    'text': json.dumps(payload), 
    'reply_channel': 'websocket.receive' 
} 

は、それが

を役に立てば幸い
関連する問題