52

我正在尝试开始为 django 编写单元测试,但我对固定装置有一些疑问:

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

我想将夹具存储在/proj_folder/fixtures/proj_fixture.json.

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

fixtures = ['proj_fixture.json']

但我的固定装置不加载。如何解决?如何添加搜索灯具的地方?一般来说,是否可以为每个应用程序中的每个测试加载整个 test_db 的夹具(如果它非常小)?谢谢!

4

9 回答 9

107

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

from django.test import TestCase

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

它在不使用的情况下工作FIXTURE_DIRS

于 2010-05-30T02:47:15.223 回答
33

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

import os.path
PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__))
FIXTURE_DIRS = (os.path.join(PROJECT_ROOT, 'fixtures'),)
于 2010-03-18T14:50:44.040 回答
32

/fixtures/你的硬盘上真的有文件夹吗?

您可能打算使用:

FIXTURE_DIRS = ('/path/to/proj_folder/fixtures/',)
于 2010-03-18T14:46:56.297 回答
18

与其创建fixtures 文件夹并在其中放置fixtures(在每个应用程序中),一种更好、更简洁的处理方法是将所有fixtures 放在项目级别的一个文件夹中并加载它们。

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 
于 2015-11-20T16:11:35.407 回答
9

假设你有一个名为 app.xml 的hello_django项目api

以下是为其创建固定装置的步骤:

  1. 可选步骤:从数据库创建夹具文件:python manage.py dumpdata --format=json > api/fixtures/testdata.json
  2. 创建测试目录:api/tests
  3. __init__.py在中创建空文件api/tests
  4. 创建测试文件:test_fixtures.py
from django.test import TestCase

class FixturesTestCase(TestCase):
  fixtures = ['api/api/fixtures/testdata.json']
  def test_it(self):
    # implement your test here
  1. 运行测试以将夹具加载到数据库中:python manage.py test api.tests
于 2017-03-12T10:57:27.110 回答
3

我这样做了,我不必提供路径参考,夹具文件名对我来说就足够了。

class SomeTest(TestCase):

    fixtures = ('myfixture.json',)
于 2015-08-12T13:42:03.473 回答
2

您有两种选择,具体取决于您是否有固定装置,或者您有一组 Python 代码来填充数据。

对于固定装置,请使用cls.fixtures,如对此问题的答案所示,

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

setUpTestData由 调用TestCase.setUpClass

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

于 2015-10-11T06:50:11.057 回答
1

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

于 2019-03-29T10:12:35.340 回答
0

如果您有重写setUpClass方法,请确保将super().setUpClass()方法作为方法中的第一行调用。加载夹具的代码在 TestCase 类中。

于 2018-07-30T14:19:54.810 回答