我正在使用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.
我设法运行测试并通过将以下内容添加到我的设置(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']
但我想知道为什么需要它?这是回滚中的错误还是我这方面的问题?
答案 0 :(得分:3)
这个问题在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我猜...