工厂调用备用构造函数(类方法)

时间:2018-06-19 18:05:13

标签: python python-3.x testing class-method factory-boy

我正在努力寻找一种方法,以使用定义为factory_boy的备用构造函数来创建Factory类(我使用@classmethod版本2.11.1和Python 3)。

因此,假设我们有一个用于使用默认构造函数和2个其他构造函数构建2D点对象的类:

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传递为coords来使用备用构造函数fromlist的方法。有办法吗?

这是我一般的工作和建造工厂的第一次经验,所以我可能还会在网上查找错误的关键字...

1 个答案:

答案 0 :(得分:5)

factory_boy的重点是简化测试实例的生成。您只需调用PointFactory() ,然后完成,您就拥有了其余代码的测试实例。 该用例无需使用任何其他构造函数。工厂将只使用主构造函数。

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

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

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

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

    coords = (1., 2.)