为了账号安全,请及时绑定邮箱和手机立即绑定

python模拟类属性不可访问

python模拟类属性不可访问

白板的微信 2021-11-09 20:32:13
模拟类对象时,我无法访问它的属性。我已经阅读了很多文档,但我是模拟新手,没有看到这段代码的问题。我希望 x 和 y 返回相同的值 1e-15class test_user_data:    scale = 1e-15class 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 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

autospec规范通常用于定义 API。使用 a 时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'>

因此,上面显示您无法访问 Mock 上未在实际user_data类中定义的属性,因为我使用了 spec。


这解释了 autospec 的工作原理,但您真正想要的是return_valuearg。继续将它添加到您的补丁装饰器中,您应该一切就绪。它应该是这样的:


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



查看完整回答
反对 回复 2021-11-09
  • 1 回答
  • 0 关注
  • 240 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信