3

我很难从django_nose.FastFixtureTestCaseto 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"

对我来说,看起来数据库实际上并没有在测试之间被刷新或回滚,因为它只发生在我单次运行测试时。

我已经单步执行了 Django 代码,看起来它们正在被刷新或回滚——这取决于我是在尝试TestCase还是在TransactionTestCase.

(我要离开是FastFixtureTestCase因为https://github.com/django-nose/django-nose/issues/220

我还应该看什么?这似乎应该是一件简单的事情,并且在什么django.test.TestCaseDjango.test.TransactionTestCase设计的范围内。

编辑:

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

class MyTest(django.test.TransactionTestCase):  # or django.test.TestCase                        

    fixtures = ['data1.json', 'data2.json', 'data3.json']                                                      

    def test1(self):    
        return # I simplified it to just this for now.                            

    def test2(self):
        return # I simplified it to just this for now.                                               

更新:

我已经通过一次测试成功地重现了这几次,所以我怀疑夹具加载代码中存在某些问题。

4

1 回答 1

4

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

_fixture_setup()在加载固定装置之前,我暂时覆盖断言数据库是干净的。断言失败。

我能够将问题缩小到 aTestCase.setUpClass()而不是 中的代码,TestCase.setUp()因此该对象从测试中泄漏并与其他TestCase夹具发生冲突。

我完全不明白的是,我认为数据库被删除并在两者之间重新创建TestCases- 但也许这是不正确的。

更新:最新版本的 Django 包括setUpTestData()应该使用的,而不是setUpClass()

于 2016-05-05T22:47:15.267 回答