Тестирование с помощью TestCase в Django и async не работают с базой данных

Итак, я использую django_channels для обработки некоторых WebSocket вещей и с тех пор, как (Django 3.1)[https://docs.djangoproject.com/en/dev/topics/testing/tools/#testing-asynchronous-code] вы можете создавать unittest-like тесты для тестирования async и решил пойти по этому пути.

Бывает, что по какой-то причине при обращении к Consumer не удается добраться до данных.

Я использую model_bakery (но также пробовал с обычным Django ORM) и у меня есть очень простой тест.

class TestChatConsumer(TestCase):
    url = '/ws/chat/'

    def setUp(self):
        self.user = baker.make_recipe('registration.user')
        self.chat = baker.make_recipe('chat.chat')

    async def test_setup_channel_layer_ok(self):
        consummer = WebsocketCommunicator(
            application=AuthMiddlewareStack(ChatConsumer.as_asgi()),
            path=self.url,
        )
        consummer.scope['user'] = self.user
        await consummer.connect()
        await consummer.send_json_to({
            'type': 'setup_channel_layer',
            'chat': self.chat.pk,
        })
        response = await consummer.receive_json_from()

        self.assertEqual(response['type'], 'info')
        self.assertEqual(response['content']['message'], 'Chat connected!')

Проблема в том, что на тесте запись создается, но при обращении к потребителям запись, похоже, отключается. Не знаете ли вы, есть ли какой-нибудь desync между тестовой базой данных или что-то еще?

В конце проблема была django.test.TestCase.
Это было исправлено путем замены class TestChatConsumer(TestCase): на class TestChatConsumer(TransactionTestCase):

Кажется, что TransactionTestCase имеет множество функций, которых нет у TestCase

Смотрите подробнее...

Вернуться на верх