【问题标题】:While testing my Websocket Consumer a model object is not created (Django Channels)在测试我的 Websocket Consumer 时,未创建模型对象(Django Channels)
【发布时间】:2021-07-24 06:42:56
【问题描述】:

我是 Django 频道的新手,我正在尝试构建一个简单的聊天应用程序。但是当我尝试测试我的异步 Websocket 消费者时,我遇到了以下异常:chat.models.RoomModel.DoesNotExist: RoomModel 匹配查询不存在。

似乎没有创建测试室。

test.py 文件如下:

class ChatTest(TestCase):

    @sync_to_async
    def set_data(self):
        room = RoomModel.objects.create_room('Room1', 'room_password_123')
        room_slug = room.slug
        user = User.objects.create_user(username='User1', password='user_password_123')
        print(RoomModel.objects.all()) # querySet here contains the created room
        return room_slug, user

    async def test_my_consumer(self):
        room_slug, user = await self.set_data()
        application = URLRouter([
            re_path(r'ws/chat/(?P<room_name>\w+)/$', ChatConsumer.as_asgi()),
        ])
        communicator = WebsocketCommunicator(application, f'/ws/chat/{room_slug}/')
        communicator.scope['user'] = user
        connected, subprotocol = await communicator.connect()
        self.assertTrue(connected)
        await communicator.send_json_to({'message': 'hello'})
        response = await communicator.receive_json_from()
        self.assertEqual('hello', response)
        await communicator.disconnect()

我的 consumer.py 文件如下:

class ChatConsumer(AsyncWebsocketConsumer):

    async def connect(self):
        self.room_name = self.scope['url_route']['kwargs']['room_name']
        self.room_group_name = f'chat_{self.room_name}'
        await self.channel_layer.group_add(self.room_group_name, self.channel_name)
        await self.accept()

    async def disconnect(self, close_code):
        await self.channel_layer.group_discard(self.room_group_name, self.channel_name)

    async def receive(self, text_data):
        self.message = json.loads(text_data).get('message')
        data = {'type': 'chat_message'}
        data.update(await self.create_message())
        await self.channel_layer.group_send(self.room_group_name, data)

    async def chat_message(self, event):
        await self.send(text_data=json.dumps({
            'message': event['message'],
            'user': event['user'],
            'timestamp': event['timestamp']
        }))

    @database_sync_to_async
    def create_message(self):
        print(RoomModel.objects.all()) # qyerySet turns out to be empty here
        room = RoomModel.objects.get(slug=self.room_name)
        msg = room.messagemodel_set.create(text=self.message, user_name=self.scope['user'])
        return {
            'message': msg.text,
            'user': self.scope['user'].username,
            'timestamp': msg.timestamp.strftime("%d/%m/%Y, %H:%M")
        }

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 你能分享你的 Models.py 文件吗

标签: django django-channels django-testing


【解决方案1】:

我有一个类似的问题,我使用此链接https://github.com/django/channels/issues/1110 解决了。总而言之,您必须将TestCase更改为TransactionTestCase

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多