具有回滚仿真的Django TransactionTestCase

时间:2015-03-24 07:16:02

标签: 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.

我设法运行测试并通过将以下内容添加到我的设置(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']

但我想知道为什么需要它?这是回滚中的错误还是我这方面的问题?

1 个答案:

答案 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我猜...