Тестирование с помощью 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