【发布时间】:2021-10-25 21:11:15
【问题描述】:
我正在尝试在 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。
【问题讨论】:
标签: python django django-orm django-testing factory-boy