Параллелизм Django: не можете создавать данные для тестирования в асинхронной функции?

  • Цель Протестировать асинхронную функцию с тестовой базой данных.
  • Проблема У меня есть асинхронные функции для каналов Django, и когда я создаю данные в setUp, данные не отражаются в проекте!!!
  • Мои тесты: примечание: эти тесты внутри класса APITestCase

class WebsocketTests(APITestCase):
       

    async def test_connect(self):
        userx = await sync_to_async(User.objects.create)(username='newusername',email='[email protected]')
        users_number = await sync_to_async(User.objects.count)()
        print(users_number) #<=== this returns 1 just fine
        communicator = WebsocketCommunicator(application, 'alerts/')
        connected, subprotocol = await communicator.connect()
        assert connected
        await communicator.disconnect()

@database_sync_to_async
def get_user(querys):
    print(User.objects.count()) #<======= this returns 0 while it should return 1

    try:
        token = parse_qs(querys.decode("utf8"))['token'][0]
        token_data = UntypedToken(token)
        user_id = token_data["user_id"]
    except:
        return 'token is invalid'

    try:
        return User.objects.get(id=user_id)
    except User.DoesNotExist:
        return 'AnonymousUser'
class QueryAuthMiddleware:
    def __init__(self, app):
        self.app = app

    async def __call__(self, scope, receive, send):
        scope['user'] = await get_user(scope["query_string"])
        return await self.app(scope, receive, send)


application = ProtocolTypeRouter({
    "http": django_asgi_app,
    "websocket": QueryAuthMiddleware(
        URLRouter(
            websocket_urlpatterns
        )
    ),
})

#settings.py
DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
            'OPTIONS': {
                'timeout': 20,  # in seconds
                # see also
                # https://docs.python.org/3.7/library/sqlite3.html#sqlite3.connect
            },
            'TEST': {
                'NAME': os.path.join(BASE_DIR, "db_test.sqlite3"),
            },

        }
    }
  • I tride
    1. replace APITestCase with django TestCase
    2. перейти на постгрес
    3. использовать from asgiref.sync import sync_to_async

person ali al-karaawi    schedule 30.06.2021    source источник
comment
почему никто не отвечает на асинхронные темы?   -  person All    schedule 30.06.2021
comment
Вы задали вопрос 1 час назад, а 55 минут назад разозлились, потому что никто не ответил?? Все это сообщество асинхронно — вам нужно уделить ему больше времени! Я бы помог, но у меня мало опыта работы с веб-сокетами или асинхронностью, поэтому не уверен, в чем здесь проблема.   -  person michjnich    schedule 30.06.2021
comment
@michjich это не первый вопрос о каналах django, я задал два слишком долго, и никто не ответил, также, когда я ищу, не так много информации о тестировании и расширении. Темы каналов   -  person ali al-karaawi    schedule 30.06.2021
comment
У меня, так сказать, нет опыта работы с асинхронностью, но я бы тоже попробовал сделать метод setUp асинхронным. Также не нужно расстраиваться, асинхронные темы получают меньше ответов, потому что в этих темах меньше экспертов.   -  person Abdul Aziz Barkat    schedule 30.06.2021