Почему моя фабричная функция Django создает модели в локальной БД, а не тестирует БД?
У меня есть несколько тестов в моем проекте Django, которые должны создать несколько моделей и сохранить их в БД. Я извлек код создания экземпляра в некоторые "фабричные" функции, которые находятся в отдельном модуле (файл.py), помогая мне быстро создавать наборы связанных моделей и т. Д. (Отсюда object.create()
материал). Эти функции очень просты и выглядят примерно так:
def foo_factory():
return Foo.objects.create(
bar="random data"
)
def bar_factory(foo_inst=foo_factory())
return Bar.objects.create(
related=foo_inst
)
Когда я запускаю тесты, тесты, которые вызывают эту функциональность (внутри класса TestCase django), сохраняют свои экземпляры модели в моей локальной базе данных dev (как указано в моем локальном файле настроек), а не в автоматически созданной временной тестовой базе данных.
Тесты выглядят примерно так:
TestFooThing(TestCase):
def test_foo_stuff(self):
foo_inst = foo_factory()
self.assertTrue(foo_inst.blah)
Насколько я понимаю, вся среда загружается с использованием настроек тестовой среды, но этот конкретный случай, похоже, не работает таким образом. Другие тесты используют тестовую БД просто отлично.
Что мне здесь не хватает?
Подробности:
Джанго 1.6
Выполнение тестов с использованием django-nose
1 ответ
Параметр bar_factory foo_inst вычисляется во время импорта модуля. В то время обычно базы данных все еще указывают на локальную базу данных dev, а не на тестовую базу данных.
Вы должны переписать значение по умолчанию, чтобы оно оценивалось намного позже. Например, вместо передачи экземпляра, передайте вызываемый объект и вызовите его в своей bar_factory.