Загрузка светильников в модульных тестах Django - PullRequest
36 голосов
/ 18 марта 2010

Я пытаюсь начать писать модульные тесты для django, и у меня возникают некоторые вопросы по поводу приборов:

Я создал приспособление для всей моей базы данных проекта (не для определенного приложения) и хочу загрузить егодля каждого теста, потому что похоже, что загрузки только прибора для определенного приложения будет недостаточно.

Я бы хотел, чтобы прибор сохранялся в /proj_folder/fixtures/proj_fixture.json.

Я установил FIXTURE_DIRS = ('/fixtures/',) в файле settings.py.Затем в моем тестовом примере я пытаюсь

fixtures = ['proj_fixture.json']

, но мои приборы не загружаются.Как это можно решить?Как добавить место для поиска светильников?В общем, нормально ли загружать прибор для всего test_db для каждого теста в каждом приложении (если он довольно маленький)?Спасибо!

Ответы [ 9 ]

84 голосов
/ 30 мая 2010

Я указал путь относительно корня проекта в TestCase следующим образом:

from django.test import TestCase

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

и это работало без использования FIXTURE_DIRS

30 голосов
/ 18 марта 2010

У вас действительно есть папка /fixtures/ на вашем жестком диске?

Вы, вероятно, намеревались использовать:

FIXTURE_DIRS = ('/path/to/proj_folder/fixtures/',)
29 голосов
/ 18 марта 2010

Хорошей практикой является использование переменной PROJECT_ROOT в ваших настройках.py:

import os.path
PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__))
FIXTURE_DIRS = (os.path.join(PROJECT_ROOT, 'fixtures'),)
13 голосов
/ 20 ноября 2015

Вместо создания папки фикстур и размещения в ней осветителей (в каждом приложении), лучший и удобный способ сделать это - поместить все осветители в одну папку на уровне проекта и загрузить их.

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 
3 голосов
/ 12 августа 2015

Я сделал это, и мне не нужно было указывать путь, мне было достаточно имени файла фикстуры.

class SomeTest(TestCase):

    fixtures = ('myfixture.json',)
2 голосов
/ 12 марта 2017

Допустим, имя вашего проекта hello_django, в нем есть приложение с именем api. Ниже приведены шаги для создания светильников в api:

  1. Необязательный шаг: создать файл фикстуры из базы данных: python manage.py dumpdata --format=json > api/fixtures/testdata.json
  2. Создать тестовый каталог: api/tests
  3. Создать пустой файл __init__.py в api/tests
  4. Создать тестовый файл: test_fixtures.py

Test Fixtures

  1. Запустить тест (загрузит ваши приборы в базу данных): python manage.py test api.tests
2 голосов
/ 11 октября 2015

У вас есть два варианта, в зависимости от того, есть ли у вас прибор или у вас есть набор кода 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 вызывается после загрузки приборов.

0 голосов
/ 29 марта 2019

Вам необходимо импортировать from django.test import TestCase, а НЕ from unittest import TestCase. Это решило проблему для меня.

0 голосов
/ 30 июля 2018

Если вы переопределили метод setUpClass, убедитесь, что вы вызываете метод super().setUpClass() в качестве первой строки метода. Код для загрузки приборов находится в классе TestCase.

...