当Django模型中的字段有choices选项时,请参见Django choices字段选项,它使用包含2个项目的可迭代项的可迭代项来定义哪些值是允许的。
- 型号 *
class IceCreamProduct(models.Model):
PRODUCT_TYPES = (
(0, 'Soft Ice Cream'),
(1, 'Hard Ice Cream'),
(2, 'Light Ice Cream'),
(3, 'French Ice Cream'),
(4, 'Italian-style Gelato'),
(5, 'Frozen Dairy Dessert'),
)
type = models.PositiveSmallIntegerField('Type', choices=PRODUCT_TYPES, default=0)
为了在Factory Boy中生成一个随机值,我会使用factory.fuzzy.FuzzyChoice,但是这只选择了一个包含2个元素的可迭代对象,它不能取所选可迭代对象的第一个元素,例如:
工厂
class IceCreamProductFactory(factory.django.DjangoModelFactory):
class Meta:
model = IceCreamProduct
type = factory.fuzzy.FuzzyChoice(IceCreamProduct.PRODUCT_TYPES)
- 错误 *
TypeError: int() argument must be a string, a bytes-like object or a number, not 'tuple'
无法获取元组的第一项。例如:
工厂
class IceCreamProductFactory(factory.django.DjangoModelFactory):
class Meta:
model = IceCreamProduct
type = factory.fuzzy.FuzzyChoice(IceCreamProduct.PRODUCT_TYPES)[0]
- 错误 *
TypeError: 'FuzzyChoice' object does not support indexing
使用默认的Python随机迭代器是可能的,但这会在声明时生成一个值,因此每个工厂对象都将具有相同的随机值。
工厂
class IceCreamProductFactory(factory.django.DjangoModelFactory):
class Meta:
model = IceCreamProduct
type = random.choice(IceCreamProduct.PRODUCT_TYPES)][0]
如何在Factory Boy中解决这个问题?我需要创建一个自定义的FuzzyAttribute吗?(如果需要,请给予)
6条答案
按热度按时间cig3rfwq1#
您将不需要FuzzyAttribute。
您可以限制可能的值,并且只将每个产品类型的int值赋予FuzzyChoice,方法如下:
它应该起作用。
请注意,模糊模块最近已被弃用,请参见(https://factoryboy.readthedocs.org/en/latest/fuzzy.html),您可能希望使用LazyFunction。
jexiocij2#
你可以做得这么简单
另外,不要将
type
用作属性,it is a bad practice to use a built-in function name as an attributepolhcujo3#
下面是我如何按照lothiraldan的建议使用
factory.LazyFunction
来实现的:mbyulnm04#
因为我不得不为很多模型做这些,所以我想出了一个更抽象的erichonkanen的解决方案,我定义了一个helper类,我把它放在我的项目的顶层test目录中,并把它导入到包含工厂的模块中:
test/helpers.py
在
app/factories.py
中hkmswyz65#
如果你根据阶级来选择...
k4ymrczo6#
我用这个: