python / expert
Snippet
Asynchrone Datenbank-Isolations-Hooks für Channels-Consumer-Tests
Das Testen asynchroner Django Channels Consumer mit Datenbankisolierung erfordert explizite Transaktionsgrenzen, die in database_sync_to_async Adaptoren gekapselt sind.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pytestfrom channels.testing import WebsocketCommunicatorfrom channels.db import database_sync_to_asyncfrom django.db import transaction@pytest.mark.asyncio@pytest.mark.django_db(transaction=True)async def test_async_consumer_transaction_isolation(application_factory):communicator = WebsocketCommunicator(application_factory(), "/ws/updates/")connected, _ = await communicator.connect()assert connected@database_sync_to_asyncdef get_atomic_state():with transaction.atomic():return Trueassert await get_atomic_state()await communicator.disconnect()
django
Erklärung
1
@pytest.mark.django_db(transaction=True)
Ermöglicht den Datenbankzugriff mit echten Transaktions-Rollbacks in asynchronen pytest-django Tests.
2
@database_sync_to_async
Kapselt synchrone Django ORM-Datenbankabfragen in Threadpool-Koroutinen für asynchrone Ereignisschleifen.
3
with transaction.atomic():
Garantiert isolierte Transaktionsgrenzen innerhalb des synchronen Kontexts für die asynchrone Ausführung.