Django channels group_send не передает сообщения о событиях в тестовой среде
У меня есть потребитель Django Channels receive функция, подобная следующей:
async def receive(self, text_data=None, bytes_data=None):
## Some other code before
await self.channel_layer.group_send(
self.room_name,
{
'type': 'answered_users_count',
'increment_answer_id': 15,
},
)
Функция answered_users_count выглядит следующим образом:
async def answered_users_count(self, event):
print(event)
increment_answer_id = event['increment_answer_id']
await self.send(
text_data=json.dumps({
'meant_for': 'all',
'type': 'answer_count',
'data': {
'increment_answer_id': increment_answer_id
}
})
)
Все это прекрасно работает с python manage.py runserver, где print(event) также печатает следующий словарь в командную строку:
{'type': 'answered_users_count', 'increment_answer_id': 15}
Однако эта часть потребителя не работает, когда дело доходит до запуска модульного теста, который я написал для него. Вот юнит-тест, который я написал для проверки вышеприведенного кода:
class SampleConsumerTest(TransactionTestCase):
async def test_channel(self):
communicator = WebsocketCommunicator(application, "/ws/walk/qa_control/12/")
connected, subprotocol = await communicator.connect()
self.assertEqual(connected, True)
await communicator.send_to(json.dumps({
"abc": "xyz"
}))
raw_message = await communicator.receive_from()
message = json.loads(raw_message)
Когда я запускаю вышеприведенный тестовый пример с помощью python manage.py test, он не работает. Я понял, что причина этого в том, что event, переданный в качестве входа в answered_users_count, не несет в себе поле increment_answer_id при выполнении теста. Я узнал об этом потому, что строка print(event) в функции answered_users_count в данном случае записала в командную строку такое значение:
{'type': 'answered_users_count'}
Это означает, что в событии, которое было передано в answered_users_count, отсутствует поле increment_answer_id.
Однако, эта часть прекрасно работает на python3 manage.py runserver. Вот полная ошибка, которую я получаю в случае неудачи тестового примера:
Для слоя канала я использую InMemoryChannelLayer. Вот настройки для него:
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels.layers.InMemoryChannelLayer'
}
}
Помогите, пожалуйста!