Почему моя фабричная функция 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), сохраняют экземпляры своих моделей в мою локальную базу данных разработки (как указано в моем файле локальных настроек), не автоматически созданная временная тестовая БД.

Тесты выглядят примерно так:

TestFooThing(TestCase):
    def test_foo_stuff(self):
        foo_inst = foo_factory()
        self.assertTrue(foo_inst.blah)

Насколько я понимаю, вся среда загружается с использованием настроек тестовой среды, но этот конкретный случай, похоже, не работает таким образом. Другие тесты прекрасно используют тестовую БД.

Что мне здесь не хватает?

Подробности:

  • Джанго 1.6

  • Запуск тестов с использованием django-nose


person Emil    schedule 28.04.2014    source источник


Ответы (1)


Параметр bar_factory foo_inst оценивается во время импорта модуля. В то время обычно базы данных по-прежнему указывают на локальную базу данных dev, а не на тестовую базу данных.

Вы должны переписать значение по умолчанию, чтобы оно оценивалось намного позже. Например, вместо передачи экземпляра передайте вызываемый объект и вызовите его в своем bar_factory.

person jtiai    schedule 28.04.2014