首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python返回MagicMock对象而不是值

Python返回MagicMock对象而不是值
EN

Stack Overflow用户
提问于 2022-10-12 09:09:54
回答 1查看 45关注 0票数 0

我有一个这样的程序:

代码语言:javascript
复制
    class SomeClass:
        _attribute = None
    
        def __init__(self, attribute):
            self._attribute = attribute
    
        @property
        def attribute(self):
            print("abc")
            return self._attribute
    
    
    class SomeChildClass:
        context: SomeClass
    
        def __init__(self):
            pass
        
        def print_attribute(self):
            print(self.context.attribute)

我想统一一下print_attribute的SomeChildClass方法。因此,我想屏蔽这个类的SomeClass本身和属性属性。

当我用

代码语言:javascript
复制
    def test_print_attribute(self):
            with patch('app.some_class.SomeClass.attribute', new_callable=PropertyMock) as mock_attr:
                mock_attr.return_value = "TEST"
                some_class = SomeClass(attribute="abc")
                self.child_class = SomeChildClass()
                self.child_class.context = some_class
                self.child_class.print_attribute()

它正在工作,我得到了测试作为输出。这个解决方案的问题是需要创建一个SomeClass的实际实例。我的最终目标是这样的:

代码语言:javascript
复制
    def test_print_attribute(self):
        with patch('app.some_class.SomeClass.attribute', new_callable=PropertyMock) as mock_attr:
            mock_attr.return_value = "TEST"
            some_class = MagicMock()
            self.child_class = SomeChildClass()
            self.child_class.context = some_class
            self.child_class.print_attribute()

这里我只得到一个打印的MagicMock对象,而不是测试

代码语言:javascript
复制
<MagicMock name='mock.attribute' id='2576201109456'>

我也尝试过这样做,它还返回一个MagicMock对象:

代码语言:javascript
复制
    @patch('app.some_class.SomeClass')
    def test_print_attribute(self, mock_some_class):
        child_class = SomeChildClass()
        child_class.context = mock_some_class
        mock_some_class.attribute.return_value = "TEST"
        child_class.print_attribute()
代码语言:javascript
复制
<MagicMock name='SomeClass.attribute' id='1701032644768'>
EN

回答 1

Stack Overflow用户

发布于 2022-10-12 09:59:55

解决方案就是不要在模拟上调用return_value方法,直接访问属性。

代码语言:javascript
复制
    @patch('app.some_class.SomeClass')
        def test_print_attribute(self, mock_class):
            child_class = SomeChildClass()
            child_class.context = mock_class
            mock_class.attribute = "TEST"
            child_class.print_attribute()

如果有人能解释这种行为,我会接受答案:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74039292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档