2010-03-18 104 views
29

我试图启动Django的编写单元测试,我有关于灯具的一些问题:加载灯具测试

我做了我的整个项目分贝的固定装置(未某些应用程序)和我想要为每个测试加载它,因为它看起来像只加载某些应用程序的灯具是不够的。

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

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

fixtures = ['proj_fixture.json'] 

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

+0

也许你可以使用相对路径?像'[“../../ fixtures/proj_fixture.json”]''。 – 2010-03-18 14:44:20

+0

我试过了,但没有奏效.. Django只在proj_folder/app_folder/fixtures中搜索灯具 – 2010-03-18 14:51:04

回答

27

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

你可能打算用:

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

我相信默认情况下,django会寻找app/fixtures,因为'manage.py loaddata fixture.json'将会在没有' FIXTURE_DIRS'变量被设置。 – 2013-08-21 10:00:42

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'),) 
72

我路径相对于项目的根目录中的TestCase像这样指定:

from django.test import TestCase 

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

和它的工作,而无需使用FIXTURE_DIRS

+0

不知道为什么这个答案没有收到更多的爱。这是正确的答案......你不必担心绝对的夹具路径。 – Cerin 2012-03-20 14:50:30

+6

我的配置可能有所不同,但直到我删除第一个“/”字符后才能正常工作。 – Mikhail 2013-09-14 00:40:41

+1

如果你在一个应用程序中进行本地测试,它似乎在努力说'dump.json',因为Django自动查找fixtures文件夹。 – 2013-09-16 06:27:33

2

我这样做,我也没有给一个路径参考,夹具的文件名,就足以让我。

class SomeTest(TestCase): 

    fixtures = ('myfixture.json',) 
+1

我也想指出'.json'扩展名也是可选的。 – Rollo 2015-09-21 01:58:18

+2

请注意,如果您没有使用最佳做法,并且您在同一个名称在不同应用程序中进行了小小的调整,那么django可能会加载错误的灯具,如果您没有列出正确灯具的显式路径你的测试文件。不要以为它只会在你当前应用的fixture目录中看到。 – 2016-06-16 19:23:24

1

根据您是否有灯具,或者您有一组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 

setUpTestDataTestCase.setUpClass调用。

可以同时使用,在这种情况下,固定装置装载首先是因为setUpTestData加载灯具后调用。

+0

'create_fuxture'有什么样的代码?我正在尝试使用灯具。即使我指定它正确,我的测试调用db。为什么?我错过了什么?它是否是'create_fixture'逻辑? – Hussain 2017-02-07 07:47:43

6

而不是创造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 
1

比方说,您的项目名称是hello_django,它有一个名为api的应用程序。下面是步骤以api创建夹具:

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

Test Fixtures

  • 运行测试(将加载您的灯具数据库):python manage.py test api.tests