由于重复键

时间:2016-05-03 19:21:49

标签: django django-testing django-nose

我无法从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

我还应该注意什么?这似乎应该是一件简单的事情,并且恰好在FastFixtureTestCasedjango.test.TestCase的设计范围内。

编辑:

测试类或多或少看起来像这样:

Django.test.TransactionTestCase

更新

我已经设法通过一次测试重现了这几次,所以我怀疑夹具加载代码中有什么东西。

1 个答案:

答案 0 :(得分:3)

我的一个基本假设是我的数据库对每个TestCase都是干净的。跟踪django核心代码,我发现了一个对象(在一个例子中是django.contrib.auth.User)已经存在的实例。

我暂时覆盖_fixture_setup()以在加载灯具之前断言db是干净的。断言失败了。

我能够将问题缩小到TestCase.setUpClass()中的代码,而不是TestCase.setUp(),因此对象漏掉了测试并与其他TestCase的灯具冲突。

我完全不明白的是我认为数据库被丢弃并在TestCase之间重新创建 - 但这可能是不正确的。