Ответ 1
У вас действительно есть папка /fixtures/
на вашем жестком диске?
Вы, вероятно, намеревались использовать:
FIXTURE_DIRS = ('/path/to/proj_folder/fixtures/',)
Я пытаюсь начать писать модульные тесты для django, и у меня есть некоторые вопросы об оснастках:
Я сделал привязку всего проекта db (не определенного приложения), и я хочу загрузить его для каждого теста, потому что похоже, что загрузка только приспособления для определенного приложения будет недостаточной.
Я хотел бы иметь светильник, хранящийся в /proj _folder/fixtures/proj_fixture.json.
Я установил FIXTURE_DIRS = ('/fixtures/',)
в свои settings.py.
Затем в моем тестовом сценарии я пытаюсь
fixtures = ['proj_fixture.json']
но мои светильники не загружаются. Как это можно решить? Как добавить место для поиска светильников? В общем, нормально ли загружать прибор для всего test_db для каждого теста в каждом приложении (если он довольно мал)? Спасибо!
У вас действительно есть папка /fixtures/
на вашем жестком диске?
Вы, вероятно, намеревались использовать:
FIXTURE_DIRS = ('/path/to/proj_folder/fixtures/',)
Я указал путь относительно корня проекта в TestCase следующим образом:
from django.test import TestCase
class MyTestCase(TestCase):
fixtures = ['/myapp/fixtures/dump.json',]
...
и он работал без использования FIXTURE_DIRS
Хорошая практика заключается в использовании переменной PROJECT_ROOT в ваших настройках .py:
import os.path
PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__))
FIXTURE_DIRS = (os.path.join(PROJECT_ROOT, 'fixtures'),)
Вместо того, чтобы создавать фиксированные папки и размещать в них светильники (в каждом приложении), лучший и быстрый способ справиться с этим состоит в том, чтобы поместить все светильники в одну папку на уровне проекта и загрузить их.
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
Я сделал это, и мне не пришлось указывать ссылку на путь, для меня было достаточно имени файла документа.
class SomeTest(TestCase):
fixtures = ('myfixture.json',)
У вас есть два варианта, в зависимости от наличия у вас прибора, или у вас есть набор кода 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
.
Скажем, имя вашего проекта hello_django
, у него есть приложение с именем api
. Ниже приведены шаги по созданию светильников в api
:
python manage.py dumpdata --format=json > api/fixtures/testdata.json
api/tests
__init__.py
в api/tests
python manage.py test api.tests