我无法从django_nose.FastFixtureTestCase
转移到django.test.TestCase
(甚至更保守的django.test.TransactionTestCase
)。我正在使用Django 1.7.11并且我正在对Postgres 9.2进行测试。
我有一个加载三个灯具文件的Testcase
类。该类包含两个测试。如果我将每个测试作为单个运行(manage test test_file:TestClass.test_name
)单独运行,它们每个都有效。如果我一起运行它们(manage test test_file:TestClass
),我会得到
IntegrityError: Problem installing fixture '<path>/data.json': Could not load <app>.<Model>(pk=1): duplicate key value violates unique constraint "<app_model_field>_49810fc21046d2e2_uniq"
对我来说,看起来db实际上并没有在测试之间刷新或回滚,因为只有在我一次运行测试时才会发生。
我已经逐步完成了Django代码,看起来他们 正在刷新或回滚 - 这取决于我是否尝试TestCase
或{{ 1}}。
(我因https://github.com/django-nose/django-nose/issues/220而离开TransactionTestCase
我还应该注意什么?这似乎应该是一件简单的事情,并且恰好在FastFixtureTestCase
和django.test.TestCase
的设计范围内。
编辑:
测试类或多或少看起来像这样:
Django.test.TransactionTestCase
更新
我已经设法通过一次测试重现了这几次,所以我怀疑夹具加载代码中有什么东西。
答案 0 :(得分:3)
我的一个基本假设是我的数据库对每个TestCase都是干净的。跟踪django核心代码,我发现了一个对象(在一个例子中是django.contrib.auth.User)已经存在的实例。
我暂时覆盖_fixture_setup()以在加载灯具之前断言db是干净的。断言失败了。
我能够将问题缩小到TestCase.setUpClass()中的代码,而不是TestCase.setUp(),因此对象漏掉了测试并与其他TestCase的灯具冲突。
我完全不明白的是我认为数据库被丢弃并在TestCase之间重新创建 - 但这可能是不正确的。