Python 带有回滚模拟的Django TransactionTestCase

Python 带有回滚模拟的Django TransactionTestCase,python,django,postgresql,testcase,django-testing,Python,Django,Postgresql,Testcase,Django Testing,我使用Django 1.7.7和Python2.7.6以及Postgres作为数据库,我遇到了一个TransactionTestCase问题。在我的迁移中,我有两个数据迁移,我希望它们在测试期间可用,因此我将serialized_rollback=True添加到我的测试用例() 测试用例的第一个测试是正常的,但是django抱怨说有一个IntegrityError: IntegrityError: duplicate key value violates unique constraint "d

我使用Django 1.7.7和Python2.7.6以及Postgres作为数据库,我遇到了一个
TransactionTestCase
问题。在我的迁移中,我有两个数据迁移,我希望它们在测试期间可用,因此我将
serialized_rollback=True
添加到我的测试用例()

测试用例的第一个测试是正常的,但是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.
我通过将以下内容添加到我的设置()中,成功地运行了测试并避免了此错误:


但我想知道为什么需要这样做?这是回滚中的一个错误还是我这边的一个问题?

这个问题在django相关的罚单中得到了很好的解释:

从那里引述:

当使用序列化的_rollback=True的TransactionTestCase时,在创建数据库并运行其迁移(以及发出迁移后信号)后,数据库的内容将序列化为_test_序列化的_内容

在第一个测试用例之后,_fixture_teardown()将刷新表,但随后将发出post_migrate信号,并在django_content_type表中创建新行(带有新的pk)

然后,在套件中的任何后续测试用例中,_fixture_setup()尝试反序列化_test_serialized_contents的内容,但这些行与数据库中已有的行相同,只是它们的PK不同

由于django_content_type表中的唯一约束,这会导致IntegrityError

已创建/发布修补程序,但仅适用于Django 1.9.x


对于以前的版本,您应该继续使用非序列化的测试应用,我想…

您刚刚帮助我解决了TransactionTestCase测试中的一个大问题。到目前为止,我还从未听说过TEST_非序列化应用程序。谢谢我认为这是因为TransactionTestCase似乎已损坏。我的代码使用1.7.2,在没有测试非序列化应用的情况下在1.7.8上停止。我正在(慢慢地)转向py.test,我相信pytest-django fixtures会对我有所帮助。最终。我能回答你的问题吗?我认为你做的每件事都很好,整个体操都是Django 1.7 ATM所要求的。我同意,这是一个问题和答案合一的问题。非常感谢!我不知道为什么Django在默认情况下不会序列化这些应用程序,因为在我的情况下,如果没有按照您的建议设置TEST_NON_SERIALIZED_应用程序,它就无法工作。
TEST_NON_SERIALIZED_APPS = ['django.contrib.contenttypes',
                            'django.contrib.auth']