python模拟类属性不可访问

模拟类对象时,我无法访问它的属性。我已经阅读了很多文档,但我是模拟新手,没有看到这段代码的问题。我希望 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


白板的微信
浏览 331回答 1
1回答

潇潇雨雨

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.stuffTraceback (most recent call last):&nbsp; File "<stdin>", line 1, in <module>&nbsp; File "/usr/lib64/python3.4/unittest/mock.py", line 574, in __getattr__&nbsp; &nbsp; 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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python