gpt4 book ai didi

python - 在python 3.4中模拟内部对象的实例方法

转载 作者:太空宇宙 更新时间:2023-11-03 16:15:46 24 4
gpt4 key购买 nike

我的代码中有一个使用第三方库的类。我想模拟通过调用库类的实例方法获得的对象的实例方法。我不清楚如何模拟这个内部对象的实例方法。以下是我的代码:

我的类(class):

from a import A

class MyClass(object):
def __init__(self):
self.obj = A()

def do_something(self):
b = self.obj.get_inner_object()
result = b.do_inner()
return result

这是我的测试类:

from unittest import TestCase
from unittest.mock import MagicMock
from unittest.mock import patch
from a import A
class TestMyClass(TestCase):
def __init__(self):
self.my_class = MyClass()

@patch.object(A,'get_inner_object')
def test_do_something(self, mock_get_inner_object):
test_res = self.my_class.do_something()

正如您在上面所看到的,我想模拟我的库的 2 个方法 - get_inner_object() 和 do_inner(),这是 get_inner_object() 返回的对象的实例方法。我能够模拟 get_inner_object(),但我不清楚如何模拟 do_inner() 方法。请澄清。这是我正在关注的帮助:https://www.toptal.com/python/an-introduction-to-mocking-in-python

最佳答案

只需模拟所有A:

@patch('a.A')
def test_do_something(self, mock_A):
mock_b = mock_A.return_value.get_inner_object.return_value
mock_b.do_inner.return_value = 'mocked return value'

test_res = self.my_class.do_something()

self.assertEqual(test_res, 'mocked return value')

毕竟,您在这里测试 MyClass,而不是 A

无论哪种方式,无论您使用 @patch.object(A, 'get_inner_object') 还是修补所有 Aself.obj.get_inner_object( ) 表达式调用一个 Mock 实例,因此此时会返回 .return_value 属性。 do_inner 方法只是对此处返回的模拟的另一个链式调用,因此您可以通过将 .return_value 属性设置为您测试的内容来设置该方法的返回内容。

要将其转换回您的 @patch.object() 情况,mock_b 就是 mock_inner_object.return_value 对象:

@patch.object(A,'get_inner_object')
def test_do_something(self, mock_get_inner_object):
mock_b = mock_get_inner_object.return_value
mock_b.do_inner.return_value = 'mocked return value'

test_res = self.my_class.do_something()

self.assertEqual(test_res, 'mocked return value')

关于python - 在python 3.4中模拟内部对象的实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38950349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com