python - FactoryBoy 正在访问普通数据库而不是 TEST 数据库
问题描述
我正在尝试在setUp
Django 测试用例的方法中创建一些对象。我使用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
尝试Product.market_category
通过随机MarketCategory
对象填充。
问题是,即使我之前创建它并确保它在数据库中(它有),它似乎也不存在pk
。
编辑:它选择了一个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)
推荐阅读
- angular - 将 typescript 变量传递给 svg image href 属性
- python - 如何将字符串拆分为 2 个单词的不同片段,其中第二个片段的第一个单词重复第一个单词的最后一个单词
- reactjs - 在子组件中反应警告不受控制的组件
- google-apps-script - 0Auth2 问题在我的谷歌表中获取我的谷歌照片库
- python - 在 Django 中使用 select 小部件从 Postgres 数据库中获取数据
- java - 如何修复 java.lang.NullPointerException:Bukkit 插件中的 null?
- reactjs - 为“无限”参数设置反应路由器
- php - 如何在 Laravel 中使用嵌套的多对多关系从数据库中获取数据
- android - 有没有办法在不知道密钥全名的情况下从我们的本地存储中删除共享首选项值?
- ruby-on-rails - Ruby on Rails 十进制比较停止工作