编程语言
首页 > 编程语言> > python – 工厂调用备用构造函数(classmethod)

python – 工厂调用备用构造函数(classmethod)

作者:互联网

我正在努力找到一种方法来使用定义为@classmethod的替代构造函数来创建类Factory(我使用Factory_boy版本2.11.1和Python 3).

因此,假设我们有一个用于构建具有默认构造函数的2D点对象的类,另外还有2个:

class Point:

    def __init__(self, x, y):
        self.x = x
        self.y = y

    @classmethod
    def fromlist(cls, coords):  # alternate constructor from list
        return cls(coords[0], coords[1])

    @classmethod
    def duplicate(cls, obj):  # alternate constructor from another Point
        return cls(obj.x, obj.y)

我创建了一个基本的Point工厂:

import factory

class PointFactory(factory.Factory):
    class Meta:
        model = Point
        inline_args = ('x', 'y')

    x = 1.
    y = 2.

默认情况下,它似乎调用类的构造函数__init__,这似乎非常合乎逻辑.我找不到一种方法来将inline_args作为使用备用构造函数fromlist的coords.有办法吗?

这是我第一次在工作和建造工厂的经历,所以我也可能在网上查找错误的关键字……

解决方法:

factory_boy的目的是让生成测试实例变得容易.你只需要调用PointFactory()就可以了,你已经完成了其余代码的测试实例.此用例不需要使用任何替代构造函数.工厂只会使用主构造函数.

如果您认为必须定义factory_boy工厂来测试您的额外构造函数,那么您就误解了它们的用法.使用factory_boy工厂为要测试的其他代码创建测试数据.您不会使用它们来测试Point类(除了生成测试数据以传递给您的构造函数之外).

请注意,仅当构造函数根本不接受关键字参数时才需要inline_args.你的Point()类没有这样的限制; x和y既可以用作位置关系也可以用作关键字参数.你可以放心地从你的定义中删除inline_args,工厂无论如何都会工作.

如果必须使用其他构造函数之一(因为无法使用主构造函数创建测试数据),只需将特定构造函数方法作为模型传递:

class PointListFactory(factory.Factory):
    class Meta:
        model = Point.fromlist

    coords = (1., 2.)

标签:python,python-3-x,testing,class-method,factory-boy
来源: https://codeday.me/bug/20190828/1747053.html