FactoryBoy访问的是普通数据库,而不是TEST数据库



我试图在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)

相关内容

  • 没有找到相关文章

最新更新