python模拟类属性不可访问

时间:2019-02-15 16:24:58

标签: python mocking

嘲笑一个类对象时,我无法访问它的属性。 我已经阅读了许多文档,但是我是模拟新手,因此看不到此代码的问题。我希望x和y返回相同的值1e-15

class test_user_data:
    scale = 1e-15

class test_signal(unittest.TestCase):
    @patch('xx.user_data', autospec=test_user_data, spec_set=True)
    def test_data(self, mock_user_data):
        x = xx.user_data()
        y = test_user_data()
        print(x.scale)
        print(y.scale)

但我明白了

<NonCallableMagicMock name='user_data().timescale' spec_set='float' id='47213638195072'>
1e-15

1 个答案:

答案 0 :(得分:1)

autospec和规范通常用于定义API。使用Mock时,您几乎可以调用或访问其上的任何属性,它只会让您使用。但是它将返回另一个模拟对象。

看到这样的东西:

>>> my_mock = Mock()
>>> my_mock.stuff
<Mock name='mock.stuff' id='139870989908344'>
>>> my_mock.junk()
<Mock name='mock.junk()' id='139870987197912'>

如果我定义了一个规范,它说您不能访问真实类中实际上不存在的东西。像这样:

>>> my_mock = Mock(spec=xx.user_data)
>>> my_mock.stuff
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python3.4/unittest/mock.py", line 574, in __getattr__
    raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'stuff'
>>> my_mock.scale
<Mock name='mock.scale' id='139871128095264'>

因此上面显示,由于我使用过规范,因此无法访问未在实际user_data类中定义的Mock属性。

这说明了自动指定的工作原理,但是您真正想要的是return_value参数。继续并将其添加到您的补丁装饰器中,您应该已经准备就绪。它应该看起来像这样:

@patch('xx.user_data', autospec=test_user_data, spec_set=True, return_value=test_user_data)