web-dev-qa-db-ja.com

Django単体テストでフィクスチャをロードする

Django=の単体テストの作成を開始しようとしています。フィクスチャについていくつか質問があります。

プロジェクトdb全体(特定のアプリケーションではない)のフィクスチャを作成し、特定のアプリのフィクスチャのみをロードするだけでは十分ではないように見えるため、テストごとにロードしたいと思います。

フィクスチャを/proj_folder/fixtures/proj_fixture.jsonに保存したいのですが。

Settings.pyでFIXTURE_DIRS = ('/fixtures/',)を設定しました。それから私のテストケースで私は試しています

fixtures = ['proj_fixture.json']

しかし、フィクスチャが読み込まれません。これをどのように解決できますか?フィクスチャを検索する場所を追加するにはどうすればよいですか?一般に、各アプリのテストごとにtest_db全体のフィクスチャをロードしても問題ありませんか(かなり小さい場合)?ありがとう!

40
gleb.pitsevich

本当にフォルダはありますか/fixtures/ハードディスクにありますか?

あなたはおそらく使用するつもりでした:

FIXTURE_DIRS = ('/path/to/proj_folder/fixtures/',)
30
Ben James

次のように、TestCaseでプロジェクトルートに対する相対パスを指定しました。

from Django.test import TestCase

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

そして、それはFIXTURE_DIRSを使わなくても機能しました

89
Evgeny

Settings.pyでPROJECT_ROOT変数を使用することをお勧めします。

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

Fixuresフォルダーを作成してフィクスチャーを(すべてのアプリに)配置するのではなく、これを処理するためのより適切で適切な方法は、プロジェクトレベルですべてのフィクスチャーを1つのフォルダーに配置してロードすることです。

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 
16
Armance

以下は、apiというアプリでプロジェクトhello_Djangoのフィクスチャを作成する手順です。

  1. オプションの手順:データベースからフィクスチャファイルを作成:python manage.py dumpdata --format=json > api/fixtures/testdata.json
  2. テストディレクトリを作成:api/tests
  3. 空のファイル__init__.pyapi/testsに作成します
  4. テストファイルを作成:test_fixtures.py

Test Fixtures

  1. テストを実行します(フィクスチャをデータベースにロードします):python manage.py test api.tests
5
Tho

私はこれをしました、そしてパス参照を与える必要はありませんでした、フィクスチャファイル名は私にとって十分でした。

class SomeTest(TestCase):

    fixtures = ('myfixture.json',)
3
Andres

フィクスチャがあるかどうか、またはデータを入力するためのPythonコードのセットがあるかどうかによって、2つのオプションがあります。

フィクスチャの場合は、この質問の an answer に示すように、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

setUpTestDataTestCase.setUpClassによって呼び出されます。

両方を使用できます。この場合、フィクスチャのロード後にsetUpTestDataが呼び出されるため、フィクスチャが最初にロードされます。

2
Jorge Leitao

インポートする必要がありますfrom Django.test import TestCaseおよびNOT from unittest import TestCase。これで問題が解決しました。

1
Ron

setUpClassメソッドをオーバーライドした場合は、メソッドの最初の行としてsuper().setUpClass()メソッドを呼び出すようにしてください。フィクスチャをロードするコードはTestCaseクラスにあります。

0
saurabheights