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



我试图在创建类Bar的实例对象test_obj时模拟它的属性。该属性是另一个名为Foo的类的实例
然后,我想测试Bar类中的bar方法,该方法正在调用Foo类的search方法。

我有这个error: AttributeError: 'str' object has no attribute 'search'。我理解这可能是因为我用str作为MockedFoo来嘲笑Bar类的foo属性。

我的问题是:如何更改mock,以便通过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()

我读过一个类似的问题,但那是为了访问该领域。我无法调整我的代码以访问这些方法。

我修改了test_bar()方法中的指令with mock.patch('lib.lib_foo.Foo', return_value="MockedFoo"),并将列表设置为创建的mock对象的方法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 ...之前创建的。

最新更新