se7*_*7en 7 python django postgresql testcase django-testing
我正在使用Django 1.7.7与python 2.7.6和Postgres作为数据库,我有一个问题TransactionTestCase.在我的迁移中,我有两个datamigrations,我希望它们在测试期间可用,所以我添加serialized_rollback = True到我的测试用例中(https://docs.djangoproject.com/en/1.7/topics/testing/overview/#test-case -serialized-rollback).
测试用例的第一次测试还可以,但是django正抱怨IntegrityError:
IntegrityError: duplicate key value violates unique constraint "django_content_type_app_label_6032a1f08b99c274_uniq"
DETAIL: Key (app_label, model)=(admin, logentry) already exists.
Run Code Online (Sandbox Code Playgroud)
我设法运行测试并通过在我的设置中添加以下内容来避免此错误(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']
Run Code Online (Sandbox Code Playgroud)
但我想知道为什么需要它?这是回滚中的错误还是我这方面的问题?
小智 4
这个问题在 django 相关票证中得到了很好的解释:https ://code.djangoproject.com/ticket/23727
引用自那里:
当使用带有serialized_rollback=True 的TransactionTestCase 时,创建数据库并运行其迁移(同时发出post_migrate 信号)后,数据库的内容将序列化到_test_serialized_contents。
在第一个测试用例之后, _fixture_teardown() 将刷新表,但随后将发出 post_migrate 信号,并在 django_content_type 表中创建新行(带有新的 PK)。
然后,在套件中的任何后续测试用例中,_fixture_setup() 尝试反序列化 _test_serialized_contents 的内容,但这些行与数据库中已有的行相同,除了它们的 PK 之外。
由于 django_content_type 表中的唯一约束,这会导致 IntegrityError。
补丁已创建/发布,但仅适用于 Django 1.9.x。
对于以前的版本,您应该继续使用 TEST_NON_SERIALIZED_APPS 我猜......