Почему моя фабричная функция 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.

Другие вопросы по тегам