【问题标题】:Testing Python objects with complicated initialization使用复杂的初始化测试 Python 对象
【发布时间】:2021-02-25 15:43:08
【问题描述】:

我发现我经常想要具有复杂初始化的 Python 对象:

class Foo(object):
    def __init__(self, thing):
        self.complicated_processing_A(thing)
        self.complicated_processing_B(thing)

然后在我的代码中创建对象,所有复杂的处理就完成了:

f = Foo(thing)

这很好,只是测试 Foo 类真的很烦人,因为你需要做很多模拟。

另一种选择是更改__init__,这样它就不会做太多,但是当我使用这个类时,我需要执行额外的步骤:

f = Foo(thing)
f.complicated_processing_A(thing)
f.complicated_processing_B(thing)

有没有一种隐藏复杂类细节的好方法,同时又有干净的测试代码?

【问题讨论】:

  • 一个可选参数,只有在设置为True时才会在构造函数中进行复杂的处理?这也默认为True?
  • @Chase,尽管很简单,但这似乎是一个值得回答的问题。开箱即用的好解决方案。
  • 另一个选项是模拟complicated_processing 方法,以防您不能或不想更改测试代码。如果你可以更改代码,我宁愿将所有复杂的初始化分解成一个可以模拟的方法,而不是引入一个仅用于测试的参数。

标签: python unit-testing testing mocking


【解决方案1】:

我想类工厂在这里可能是一个很好的解决方案:

class Foo(object):
    def __init__(self, thing):
        self.thing = thing

    def complicated_processing_A(self):
        ...

    def complicated_processing_B(self):
        ...

    @classmethod
    def create(cls, thing):
        f = cls(thing)
        self.complicated_processing_A()
        self.complicated_processing_B()
        return f

在我的代码中,我可以这样做:

f = Foo.create(thing)

而且测试所有部分要容易得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2013-06-27
    • 1970-01-01
    • 2011-03-09
    • 2017-04-28
    • 1970-01-01
    相关资源
    最近更新 更多