在django单元测试中加载夹具

gle*_*ich 37 django unit-testing fixtures

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

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

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

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

fixtures = ['proj_fixture.json']
Run Code Online (Sandbox Code Playgroud)

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

Evg*_*eny 87

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

from django.test import TestCase

class MyTestCase(TestCase):
    fixtures = ['/myapp/fixtures/dump.json',]
    ...
Run Code Online (Sandbox Code Playgroud)

它没有使用它 FIXTURE_DIRS

  • 我的配置可能不同但直到我删除了第一个`/`字符才能生效. (9认同)
  • 不知道为什么这个答案没有得到更多的爱。这是正确的答案...您不必担心绝对的夹具路径。 (2认同)
  • 如果您在一个应用程序中进行本地测试,则似乎可以使用“dump.json”,因为 Django 会自动查找装置文件夹。 (2认同)

Ben*_*mes 30

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

您可能打算使用:

FIXTURE_DIRS = ('/path/to/proj_folder/fixtures/',)
Run Code Online (Sandbox Code Playgroud)

  • 我相信默认情况下django会查找app/fixtures,因为`manage.py loaddata fixture.json`可以在没有设置`FIXTURE_DIRS`变量的情况下工作. (2认同)

Leo*_*kov 30

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

import os.path
PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__))
FIXTURE_DIRS = (os.path.join(PROJECT_ROOT, 'fixtures'),)
Run Code Online (Sandbox Code Playgroud)


Arm*_*nce 13

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

from django.core.management import call_command

class TestMachin(TestCase):

    def setUp(self):
        # Load fixtures
        call_command('loaddata', 'fixtures/myfixture', verbosity=0)
Run Code Online (Sandbox Code Playgroud)

调用 call_command 等同于运行:

 manage.py loaddata /path/to/fixtures 
Run Code Online (Sandbox Code Playgroud)


Tho*_*Tho 8

说你有一个名为工程hello_djangoapi应用。

以下是为其创建夹具的步骤:

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

测试夹具

  1. 运行测试以将夹具加载到数据库中: python manage.py test api.tests