python 修补一个类(另一个类的属性)以访问其方法

cnwbcb6i  于 2023-01-16  发布在  Python
关注(0)|答案(1)|浏览(132)

我试图在创建示例对象test_obj时模仿类Bar的属性。该属性是另一个名为Foo的类的示例。
然后,我想测试Bar类中的bar方法,该方法调用Foo类的search方法。
我有这个error: AttributeError: 'str' object has no attribute 'search'。我知道这可能是因为我用MockedFoo作为str来嘲笑Bar类的foo属性。
我的问题是:如何更改模拟,以便可以通过Bar类的foo对象访问Foo类的方法?search方法还必须返回一个列表(我可以这样做),但我无法首先访问此方法。
下面是我的代码:

import unittest
from mock import patch

class Foo(object):
    def __init__(self):
        self.foo = 'foo'
    
    def search(self):
        # do something

class Bar(object):
    def __init__(self):
        self.id = "123"
        self.name = "abc"
        self.foo = Foo()

    def bar(self):
        return self.foo.search()
    

def test_bar():
# initialization of Bar object
    with mock.patch('lib.lib_foo.Foo', return_value="MockedFoo")
        test_obj = Bar()
    test_obj.bar()

我读了一个similar issue,但那是为了访问字段。我无法调整我的代码来访问方法。

oxf4rvwz

oxf4rvwz1#

我已经修改了test_bar()方法中的指令with mock.patch('lib.lib_foo.Foo', return_value="MockedFoo"),并且设置了一个列表作为所创建的模拟对象的search方法的返回值。
下面是我的代码:

import unittest
from unittest.mock import patch

class Foo(object):
    def __init__(self):
        self.foo = 'foo'

    def search(self):
        # do something
        pass

class Bar(object):
    def __init__(self):
        self.id = "123"
        self.name = "abc"
        self.foo = Foo()

    def bar(self):
        return self.foo.search()

class MyTestCase(unittest.TestCase):

    def test_bar(self):
        test_obj = Bar()
        with patch.object(test_obj, 'foo') as mock_foo:
            mock_foo.search.return_value = ['my', 'test', 'list']
            self.assertEqual(['my', 'test', 'list'], test_obj.bar())

if __name__ == '__main__':
    unittest.main()

注意,test_obj对象是在上下文管理器with ...之前创建的。

相关问题