嘲笑一个类对象时,我无法访问它的属性。 我已经阅读了许多文档,但是我是模拟新手,因此看不到此代码的问题。我希望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
答案 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)