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?