it-roy-ru.com

Загрузка светильников в модульных тестах Django

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

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

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

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

fixtures = ['proj_fixture.json']

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

35
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

82
Evgeny

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

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

Вместо того, чтобы создавать папку «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 
9
Armance

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

class SomeTest(TestCase):

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

Допустим, имя вашего проекта 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
Tho

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

2
Jorge Leitão

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

0
saurabheights