繁体   English   中英

FactoryBoy 正在访问普通数据库而不是测试数据库

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM