2015-03-24 6 views
6

Ich benutze Django 1.7.7 mit Python 2.7.6 und Postgres als Datenbank und ich hatte ein Problem mit einem TransactionTestCase. In meinen Migrationen hatte ich zwei Datamigrationen und ich wollte, dass sie während der Tests verfügbar sind, so fügte ich serialized_rollback = True zu meinem Testfall hinzu (https://docs.djangoproject.com/en/1.7/topics/testing/overview/#test-case-serialized-rollback).Django TransactionTestCase mit Rollback-Emulation

Der erste Test der Testfälle war ok, aber django beschwerte sich mit einem IntegrityError dann:

IntegrityError: duplicate key value violates unique constraint "django_content_type_app_label_6032a1f08b99c274_uniq" 
DETAIL: Key (app_label, model)=(admin, logentry) already exists. 

ich es geschafft, die Tests zu laufen und diesen Fehler zu vermeiden, indem Sie die folgenden auf meine Einstellungen hinzugefügt (https://docs.djangoproject.com/en/1.7/ref/settings/#std:setting-TEST_NON_SERIALIZED_APPS):

TEST_NON_SERIALIZED_APPS = ['django.contrib.contenttypes', 
          'django.contrib.auth'] 

Aber ich würde gerne wissen, warum ist das nötig? Ist das ein Fehler im Rollback oder ist das ein Problem für mich?

+0

Sie mir nur geholfen, um ein wirklich großes Problem mit meinem TransactionTestCase Test zu erhalten. Ich habe noch nie von TEST_NON_SERIALIZED_APPS gehört. VIELEN DANK. Ich denke, das liegt daran, dass TransactionTestCase fehlerhaft ist. Mein Code hat mit 1.7.2 funktioniert, er hat am 1.7.8 ohne TEST_NON_SERIALIZED_APPS angehalten. Ich bin (langsam) auf py.test umgestiegen, irgendwie glaube ich, dass pytest-django-Einbauten mir dabei helfen werden. Schließlich. Meine Antwort für deine Frage? Ich denke, du hast alles richtig gemacht und diese ganze Gymnastik ist mit Django 1.7 ATM erforderlich. – dotz

+0

Ich stimme zu, das ist eine Frage und Antwort alles in einem. Danke vielmals! Ich bin mir nicht sicher, warum Django diese Apps nicht standardmäßig serialisiert, weil es in meinem Fall nicht funktionierte, wenn TEST_NON_SERIALIZED_APPS nicht wie vorgeschlagen gesetzt wurde. –

Antwort

2

Dieses Problem wirklich gut erklärt in django Zusammenhang Ticket: https://code.djangoproject.com/ticket/23727

von dort Zitat:

Wenn ein TransactionTestCase mit serialized_rollback = True verwendet, nach der Erstellung der Datenbank und ihre Migrationen laufen (zusammen mit das post_migrate-Signal ausgibt), wird der Inhalt der Datenbank zu _test_serialized_contents serialisiert.

Nach dem ersten Testfall löschte _fixture_teardown() die Tabellen, aber dann würde das Signal post_migrate ausgegeben und neue Zeilen (mit neuen PKs) in der Tabelle django_content_type erstellt.

Dann versucht _fixture_setup() in allen nachfolgenden Testfällen in einer Suite den Inhalt von _test_serialized_contents zu deserialisieren, aber diese Zeilen sind identisch mit den Zeilen, die sich bereits in der Datenbank befinden, mit Ausnahme ihrer PKs.

Dies verursacht einen IntegrityError aufgrund der eindeutigen Einschränkung in der Tabelle django_content_type.

Ein Patch wurde erstellt/veröffentlicht, aber nur für Django 1.9.x.

Bei früheren Versionen, sollten Sie weiterhin TEST_NON_SERIALIZED_APPS verwenden Ich denke, ...