我试图在Django测试用例的setUp
方法中创建一些对象。我使用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
试图用随机的MarketCategory
对象填充Product.market_category
。
问题是,它似乎不存在,即使我已经创建了它之前,并确保它是在数据库(它有pk
)。
编辑:它选择了一个pk=25的MarketCategory
对象,但在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
。
定义市场类别字段将导致问题,填充选项的查询集将在导入模块时随机执行,并且返回的实例可能不再存在。应该使用SubFactory
class ProductFactory(DjangoModelFactory):
market_category = factory.SubFactory(MarketplaceCategoryFactory)
class Meta:
model = Product
将queryset直接传递给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)