2016-10-19 4 views
0

Ich habe versucht, einen Test für einen der Verbraucher in Kanälen Multichat Beispielprojekt zu erstellen: https://github.com/andrewgodwin/channels-examples/tree/master/multichat. Die Consumer-Funktion sieht so aus:Django Channels HttpClient Test Fehler

Jetzt geht der interessante Fehler, den ich lief, so. In meiner Testfunktion Version 1:

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) 

Der Test mir folgende Fehler gibt:

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> 

Testfunktion Version 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) 

Der Test kann jetzt Route die Nachricht erfolgreich an den richtigen Benutzer, aber aufgrund der Benutzerauthentifizierung nicht fortfahren können:

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 

Meine Fragen sind:

1) Warum HttpClient.send und HttpClient.consume separat produzieren unterschiedliches Verhalten als HttpClient.send_and_consume Aufruf würde anrufen. Ich schaute auf die send_and_consume Funktion und es ruft einfach senden und konsumieren getrennt wie ich es getan habe.

2) Wie kann ich es so einrichten, dass ich den Benutzer-Login-Fehler nicht bekommen würde?

Antwort

0

Ich fand tatsächlich die Antworten nach etwas mehr Graben.

1) send_and_consume hat ein anderes Verhalten als send dann consume Aufruf, weil ich hier bin mit Httpclient. HttpClient erbt vom Client und verfügt über eine eigene Implementierung der send-Methode, implementiert jedoch nicht die -Methode. Wenn Sie send_and_consume aufrufen, rufen Sie im Wesentlichen Client.send und Client.consume auf, aber in meinem Fall brauchte ich HttpClient.send und Client.consume.

2) Um den Benutzer Login Fehler zu vermeiden, muss ich eine Sitzung initialisieren. Was kann in einem anderen Verbraucher getan werden. Im Beispiel war es das:

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

Also hier mein Code ist schließlich die Stücke setzen zusammen:

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... 

Ich hoffe, das die Menschen mit ähnlichen Problemen hilft.

Verwandte Themen