![](/img/trans.png)
[英]Specify Factory db column names with FactoryBoy in a Django Test?
[英]FactoryBoy is accessing normal DB instead of TEST DB
我正在尝试在 Django 测试用例的setUp
方法中创建一些对象。 我使用FactoryBoy
帮助我创建对象。 但是FactoryBoy
似乎在数据库中找不到任何对象。
工厂.py
class ProductFactory(DjangoModelFactory):
...
market_category = factory.fuzzy.FuzzyChoice(list(MarketplaceCategory.objects.all()))
class Meta:
model = Product
测试.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
object 填充Product.market_category
。
问题是它似乎不存在,即使我之前创建它并确保它在数据库中(它有pk
)。
编辑:它选择了 pk=25 的MarketCategory
object,但在测试数据库中只有一个这样的对象,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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.