有没有办法在factoryboy中使用临时非字段变量?

问题描述 投票:0回答:2

我正在定义一些工厂来测试我的电子商务商店。我创建了一个 Faker 提供程序,它可以返回一个包含随机产品所有数据的字典。

然后我想使用该字典来填充我工厂中的字段。这是因为字典中的数据是连贯的。我不想创建一个数据不一致的工厂,例如a 产品名称:“短袖 T 恤”,描述:“漂亮、舒适的鞋子。”有没有一种方法可以实现类似的功能

class ProductFactory(factory.django.DjangoModelFactory):
    temporary_product_dict = fake.product_dict_from_provider()
    
    name = temporary_product_dict["name"]
    description = temporary_product_dict["description"]
    category = temporary_product_dict["category"]
    ...

    class Meta:
        model = models.Product

当我做这件事时,我收到一个错误,告诉我temporary_product_dict不是产品模型的属性。

python django pytest faker factory-boy
2个回答
4
投票

我使用

class Params
如下:

class OptionTypeFactory(factory.django.DjangoModelFactory):
    """OptionType model factory."""

    class Meta:
        model = OptionType

    class Params:
        # Obtain coherent data for an option type from provider
        option_type = fake.product_option_type()

    name = Params.option_type["name"]
    display_name = Params.option_type["display_name"]
    index = Params.option_type["index"]
    created = datetime.datetime.strptime(
        Params.option_type["created"], "%Y-%m-%d %H:%M:%S"
    )
    updated = datetime.datetime.strptime(
        Params.option_type["updated"], "%Y-%m-%d %H:%M:%S"
    )


register(OptionTypeFactory)

0
投票

我喜欢

Params
的方法。在学习这种方法之前,我使用了惰性属性,它们可以引用之前声明和初始化的属性。

def get_random_city():
    # left as exercise
    pass


def get_city(zip_code: str):
    # left as exercise
    pass


class CityFactory():

    @factory.lazy_attribute
    def zip_code(self):
        while True:
            loc = get_random_city()
            if loc.postal_code and loc.place_name and loc.admin1_code:
                return loc.postal_code

    @factory.lazy_attribute
    def city(self):
        loc = get_city(self.zip_code)
        return loc.place_name

    @factory.lazy_attribute
    def state(self):
        loc = get_city(self.zip_code)
        return loc.admin1_code

© www.soinside.com 2019 - 2024. All rights reserved.