2016-10-19 15 views
0

チャンネルのマルチチャットサンプルプロジェクトのコンシューマのいずれかのテストを作成しようとしています:https://github.com/andrewgodwin/channels-examples/tree/master/multichat。コンシューマ関数は次のようになります。DjangoチャンネルHttpClientテストエラー

@channel_session_user 
def chat_join(message): 
    print(message.content) 
    room = get_room_or_error(message[MsgFields.ROOM], message.user) 

    if NOTIFY_USERS_ON_ENTER_OR_LEAVE_ROOMS: 
     room.send_msg(None, message.user.nickname, message.user.id, MSG_TYPE_ENTER) 

    room.websocket_group.add(message.reply_channel) 
    message.channel_session[ChannelSession.ROOMS] = list(set(message.channel_session[ChannelSession.ROOMS]).union([room.id])) 

    recent_msgs = Message.objects.filter(room=room.id).order_by(ChatModelFields.CREATED_AT)[:10] 
    history = [] 
    for msg in recent_msgs: 
     history.append({ 
      ChatModelFields.CONTENT: msg.content, 
      ChatModelFields.CREATOR: msg.creator, 
      MsgFields.MSG_TYPE: MSG_TYPE_MESSAGE, 
     }) 

    message.reply_channel.send({ 
     'text': json.dumps({ 
      MsgFields.USER_JOIN: str(room.id), 
      'history': history, 
     }) 
    }) 

ここで私が実行している興味深いエラーは、このようになります。

def test_chat_send(self): 
     user = HubUser.objects.create_user(
      self.TEST_EMAIL, 
      password=self.TEST_PASSWORD, 
      nickname=self.TEST_NICKNAME 
     ) 
     room = ChatRoom.objects.create(creator=self.TEST_NICKNAME) 

     msg_join = { 
      MsgFields.ROOM: 1, 
      MsgFields.COMMAND: 'join', 
     } 
     msg_send = { 
      MsgFields.MESSAGE: self.TEST_MSG, 
      MsgFields.CREATOR: user, 
      MsgFields.ROOM: 1, 
      MsgFields.COMMAND: 'send', 
     } 

     c = HttpClient() 
     c.login(username=self.TEST_EMAIL, password=self.TEST_PASSWORD) 
     c.send_and_consume(RECEIVER_CHANNEL, content=msg_join, fail_on_none=True) 

テストは私に次のエラーを与える:

Traceback (most recent call last): 
    File "J:\Web\HubService\src\chat\tests\tests.py", line 60, in test_chat_send 
    c.send_and_consume(RECEIVER_CHANNEL, content=msg_join, fail_on_none=True) 
    File "C:\Users\Doge\Envs\dogeenv\lib\site-packages\channels\tests\base.py", line 127, in send_and_consume 
    return self.consume(channel, fail_on_none=fail_on_none) 
    File "C:\Users\Doge\Envs\dogeenv\lib\site-packages\channels\tests\base.py", line 118, in consume 
    raise AssertionError("Can't find consumer for message %s" % message) 
AssertionError: Can't find consumer for message <channels.message.Message object at 0x0000000006086B70> 

テスト機能バージョン2:

def test_chat_send(self): 
      user = HubUser.objects.create_user(
       self.TEST_EMAIL, 
       password=self.TEST_PASSWORD, 
       nickname=self.TEST_NICKNAME 
      ) 
      room = ChatRoom.objects.create(creator=self.TEST_NICKNAME) 

      msg_join = { 
       MsgFields.ROOM: 1, 
       MsgFields.COMMAND: 'join', 
      } 
      msg_send = { 
       MsgFields.MESSAGE: self.TEST_MSG, 
       MsgFields.CREATOR: user, 
       MsgFields.ROOM: 1, 
       MsgFields.COMMAND: 'send', 
      } 

      c = HttpClient() 
      c.login(username=self.TEST_EMAIL, password=self.TEST_PASSWORD) 
      c.send(RECEIVER_CHANNEL, content=msg_join) 
      c.consume(RECEIVER_CHANNEL, fail_on_none=True) 

テストすることができます今すぐ正常にルーティングメッセージ私のテスト機能バージョン1では 正しい消費者に送信するが、ユーザー認証のために進めることができない:

Traceback (most recent call last): 
    File "J:\Web\HubService\src\chat\tests\tests.py", line 59, in test_chat_send 
    c.consume(RECEIVER_CHANNEL, fail_on_none=True) 
    File "C:\Users\Doge\Envs\dogeenv\lib\site-packages\channels\tests\base.py", line 116, in consume 
    return consumer(message, **kwargs) 
    File "C:\Users\Doge\Envs\dogeenv\lib\site-packages\channels\sessions.py", line 64, in inner 
    return func(message, *args, **kwargs) 
    File "C:\Users\Doge\Envs\dogeenv\lib\site-packages\channels\auth.py", line 42, in inner 
    return func(message, *args, **kwargs) 
    File "J:\Web\HubService\src\chat\consumers.py", line 38, in chat_join 
    room = get_room_or_error(message[MsgFields.ROOM], message.user) 
    File "J:\Web\HubService\src\chat\utils.py", line 24, in get_room_or_error 
    raise ClientError("User not logged in") 
chat.exceptions.ClientError: User not logged in 

私の質問は以下のとおりです。

1)なぜHttpClient.sendHttpClient.consumeを呼び出すと、別途HttpClient.send_and_consumeを呼び出すとは異なる動作を生成します。私はsend_and_consume関数を見て、それは私がそれをやったように別々にsendとconsumeを呼び出しているだけです。

2)どうすればユーザーログインエラーが発生しないようにすることができますか?

答えて

0

私は実際にはもう少し掘り下げて答えを見つけました。

1)send_and_consumeは、ここではHttpClientを使用しているため、sendと呼び、consumeと異なる動作をします。 HttpClientはクライアントから継承し、sendメソッドの実装を持っていますが、send_and_consumeメソッドを実装していません。 send_and_consumeを呼び出すと、基本的にClient.sendClient.consumeが呼び出されますが、私の場合はHttpClient.sendClient.consumeが必要でした。

2)ユーザーのログインエラーを回避するために、セッションを初期化する必要があります。それは他の消費者の中で行うことができます。だからここに私のコードは一緒にすべてのピースを入れた後だ

@channel_session_user_from_http 
def ws_connect(message): 
    # Initialise their session 
    message.channel_session['rooms'] = [] 

def user_connect(self, client): 
    client.send('websocket.connect', path='/chat/stream') 
    client.consume('websocket.connect', fail_on_none=True) 

def test_chat_join(self): 
    user = HubUser.objects.create_user(
     self.TEST_EMAIL, 
     password=self.TEST_PASSWORD, 
     nickname=self.TEST_NICKNAME 
    ) 
    room = ChatRoom.objects.create(creator=self.TEST_NICKNAME) 

    c = HttpClient() 
    c.login(username=self.TEST_EMAIL, password=self.TEST_PASSWORD) 
    self.user_connect(c) 
    msg_join = { 
     MsgFields.ROOM: 1, 
     MsgFields.COMMAND: 'join', 
    } 
    c.send(RECEIVER_CHANNEL, content=msg_join) 
    c.consume(RECEIVER_CHANNEL, fail_on_none=True) 
    # asserts and etc... 

私は、これは同様の問題を持つ人々を支援を期待例では、これでした。

関連する問題