在django单元测试中加载夹具

时间:2010-03-18 14:39:28

标签: django unit-testing fixtures

我正在尝试开始为django编写单元测试,我对夹具有一些疑问:

我制作了我的整个项目数据库(不是某些应用程序)的夹具,我想为每个测试加载它,因为看起来只加载某个应用程序的夹具是不够的。

我想把夹具存放在/proj_folder/fixtures/proj_fixture.json中。

我在settings.py中设置了FIXTURE_DIRS = ('/fixtures/',)。 然后在我的测试用例中我正在尝试

fixtures = ['proj_fixture.json']

但是我的灯具没有加载。 怎么解决这个问题? 如何添加搜索灯具的地方? 一般情况下,为每个应用程序中的每个测试加载整个test_db的夹具是否可以(如果它非常小)? 谢谢!

9 个答案:

答案 0 :(得分:83)

我在TestCase中指定了相对于项目根目录的路径,如下所示:

from django.test import TestCase

class MyTestCase(TestCase):
    fixtures = ['/myapp/fixtures/dump.json',]
    ...

并且无需使用FIXTURE_DIRS

即可使用

答案 1 :(得分:31)

你的硬盘上确实有一个文件夹/fixtures/吗?

您可能打算使用:

FIXTURE_DIRS = ('/path/to/proj_folder/fixtures/',)

答案 2 :(得分:29)

好的做法是在settings.py中使用PROJECT_ROOT变量:

import os.path
PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__))
FIXTURE_DIRS = (os.path.join(PROJECT_ROOT, 'fixtures'),)

答案 3 :(得分:13)

不是创建fixures文件夹并在其中放置灯具(在每个应用程序中),处理此问题的更好和更简洁的方法是将所有灯具放在项目级别的一个文件夹中并加载它们。

from django.core.management import call_command

class TestMachin(TestCase):

    def setUp(self):
        # Load fixtures
        call_command('loaddata', 'fixtures/myfixture', verbosity=0)

调用call_command等同于运行:

 manage.py loaddata /path/to/fixtures 

答案 4 :(得分:3)

我这样做了,我没有提供路径参考,夹具文件名对我来说已经足够了。

class SomeTest(TestCase):

    fixtures = ('myfixture.json',)

答案 5 :(得分:2)

您有两个选择,具体取决于您是否有夹具,或者您有一组Python代码来填充数据。

对于灯具,请使用cls.fixtures,如此an answer中所示,

class MyTestCase(django.test.TestCase):
    fixtures = ['/myapp/fixtures/dump.json',]

对于Python,请使用cls.setUpTestData

class MyTestCase(django.test.TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.create_fixture()  # create_fixture is a custom function
{p> setUpTestDataTestCase.setUpClass调用。

您可以同时使用两者,在这种情况下首先加载灯具,因为在加载灯具后会调用setUpTestData

答案 6 :(得分:2)

我们假设您的项目名称为hello_django,它有一个名为api的应用。以下是在api中创建灯具的步骤:

  1. 可选步骤:从数据库创建fixture文件:python manage.py dumpdata --format=json > api/fixtures/testdata.json
  2. 创建测试目录:api/tests
  3. __init__.py
  4. 中创建空文件api/tests
  5. 创建测试文件:test_fixtures.py
  6. Test Fixtures

    1. 运行测试(将在数据库中加载灯具):python manage.py test api.tests

答案 7 :(得分:0)

如果您已覆盖setUpClass方法,请确保将super().setUpClass()方法作为该方法的第一行。加载灯具的代码在TestCase类中。

答案 8 :(得分:0)

您需要导入from django.test import TestCase而不是from unittest import TestCase。那为我解决了这个问题。