具有回滚仿真的Django TransactionTestCase

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