测试属性的Pythonic方法?

测试属性的Pythonic方法?,python,unit-testing,oop,mocking,pytest,Python,Unit Testing,Oop,Mocking,Pytest,我在使用@property装饰器编写类属性的单元测试时遇到了一个问题。我正在使用优秀的py.test软件包进行测试,并且肯定更愿意坚持使用它,因为它很容易设置夹具。我正在为其编写单元测试的代码如下所示: class Foo(object): def __init__(self, fizz, buzz, (and many more...)): self.fizz = fizz self.buzz = buzz

我在使用
@property
装饰器编写类属性的单元测试时遇到了一个问题。我正在使用优秀的py.test软件包进行测试,并且肯定更愿意坚持使用它,因为它很容易设置夹具。我正在为其编写单元测试的代码如下所示:

    class Foo(object):

        def __init__(self, fizz, buzz, (and many more...)):
            self.fizz = fizz
            self.buzz = buzz
            self.is_fizzing = #some function of fizz
            self.is_fizz_and_buzz = fizz and buzz
            ...

        @property
        def is_bar(self):
            return self.is_fizz_and_buzz and self.buzz > 5

        @property
        def foo_bar(self):
            # Note that this property uses the property above
            return self.is_bar + self.fizz

        # Long list of properties that call each other
当为使用多个其他属性的属性编写单元测试时,有时会出现最多四个属性的长链的问题。对于每个单元测试,我需要确定需要设置哪些输入,更糟糕的是,这些输入可能与测试特定方法的功能无关。因此,我最终测试了比某些“属性”所需的更多的案例

我的直觉告诉我,如果这些实际上是“属性”,它们就不应该有这么长的、需要测试的计算。也许最好将实际的方法分离出来(使它们成为类方法),并编写调用这些类方法的新属性

当前代码的另一个问题——如果我错了,请纠正我——是每次调用属性(大多数属性被多次调用)时,都会重新计算属性。这似乎效率极低,可以通过新的属性进行修复

测试属性有意义吗?换句话说,属性本身应该在属性中计算,还是只设置?像我上面描述的那样重写代码似乎太不和谐了。为什么一开始就有房产?如果属性非常简单,不需要测试,为什么不在init中定义属性呢

如果这些问题很愚蠢,我很抱歉。我对python还是相当陌生的

编辑/更新:
是否有可能(简单/pythonic)模拟对象,然后对属性/属性执行测试?

imo最简单的事情就是测试属性,例如
foo_-bar
,作为使用其函数成员的常规方法,例如
foo_-bar.func
,该函数是
@property
自动提供的

对我来说,使用pytest&unittest.mock,这意味着当
foo\u bar
是一种正常的非属性方法时,不需要执行以下操作:

类TestFoo:
def测试工具条(自身):
foo\u mock=mock.create\u autospec(foo)
#但是,设置'foo_mock'是测试所必需的
断言Foo.Foo\u条(Foo\u mock)==某个值
我将更改最后一行以执行此操作:

assert Foo.Foo\u bar.func(Foo\u mock)==some\u值

如果您需要在过程中存根/模拟其他属性(如
Foo.is_bar
),请查看。

这有什么不符合Pythonic的?有一个在一个属性中只调用一次的方法用于测试似乎会变得过于复杂,特别是如果我对一个类中的所有~20个属性都这样做,但你说得有道理。这将大大简化测试,因此可能是值得的。。