2010-03-18 72 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