FactoryBoy обращается к обычной БД вместо БД TEST
Я пытаюсь создать некоторые объекты в методе setUp
в тестовом примере Django. Я использую FactoryBoy
, который помогает мне в создании объектов. Но кажется, что FactoryBoy
не может найти ни одного объекта в базе данных.
factories.py
class ProductFactory(DjangoModelFactory):
...
market_category = factory.fuzzy.FuzzyChoice(list(MarketplaceCategory.objects.all()))
class Meta:
model = Product
tests.py
from django.test import TestCase
from marketplaces.models import MarketplaceCategory
class MyTestCase(TestCase):
def setUp(self) -> None:
...
self.marketplace_category = MarketplaceCategoryFactory.create()
print(MarketplaceCategory.objects.first().pk) # prints 1
self.product = ProductFactory(created_by=self.user)
Как видите, ProductFactory
пытается заполнить Product.market_category
случайным MarketCategory
объектом.
Проблема в том, что кажется, что он не существует, даже когда я создал его раньше и убедился, что он есть в db (у него есть pk
).
EDIT: Он выбрал объект MarketCategory
с pk=25, но в тестовой базе данных есть только один такой объект с pk=1. Я думаю, что он обращается к БД разработки Django вместо тестовой.
Ошибка:
psycopg2.errors.ForeignKeyViolation: insert or update on table "products_product" violates foreign key constraint "products_product_market_category_id_2d634517_fk"
DETAIL: Key (market_category_id)=(25) is not present in table "marketplaces_marketplacecategory".
Есть ли у вас идеи, почему он ведет себя таким образом? Похоже, что Factory
обращается к реальному DB
вместо testdb
по какой-то причине.
Определение поля "market_category" подобным образом вызовет проблемы, набор запросов, заполняющий варианты, будет выполняться в случайное время всякий раз, когда модуль импортируется, и возвращаемые экземпляры могут больше не существовать. Вы должны использовать SubFactory
class ProductFactory(DjangoModelFactory):
market_category = factory.SubFactory(MarketplaceCategoryFactory)
class Meta:
model = Product
Передайте набор запросов непосредственно в FuzzyChoice
для получения случайного существующего значения, не преобразуйте его в список
class ProductFactory(DjangoModelFactory):
market_category = factory.fuzzy.FuzzyChoice(MarketplaceCategory.objects.all())
class Meta:
model = Product
Это создаст экземпляр каждый раз, когда вы создаете продукт, но вы можете передать "market_category" фабрике, чтобы переопределить его
class MyTestCase(TestCase):
def setUp(self) -> None:
self.marketplace_category = MarketplaceCategoryFactory.create()
self.product = ProductFactory(created_by=self.user, market_category =self.marketplace_category)