Python 返回 MagicMock 对象而不是 return_value

我有一个 python 文件 a.py,它包含两个类 AB

class A(object):
def method_a(self):
return "Class A method a"


class B(object):
def method_b(self):
a = A()
print a.method_a()

我想单一测试 method_b在类 B通过嘲笑 A。为此目的,以下是文件 testa.py的内容:

import unittest
import mock
import a




class TestB(unittest.TestCase):


@mock.patch('a.A')
def test_method_b(self, mock_a):
mock_a.method_a.return_value = 'Mocked A'
b = a.B()
b.method_b()




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

我希望在输出中得到 Mocked A,但我得到的是:

<MagicMock name='A().method_a()' id='4326621392'>

我哪里做错了?

90925 次浏览

当您使用 @mock.patch('a.A')时,您正在用 mock_a替换测试代码中的类 A

然后在 B.method_b中设置 a = A(),现在是 a = mock_a()-也就是 amock_areturn_value。因为没有指定这个值,所以它是一个常规的 MagicMock; 这也没有配置,所以在调用它的方法时会得到默认响应(另一个 MagicMock)。

相反,您希望将 ABC1的 return_value配置为具有适当的方法,您可以按照以下任一方法进行配置:

mock_a().method_a.return_value = 'Mocked A'
# ^ note parentheses

或者,也许更明确地说:

mock_a.return_value.method_a.return_value = 'Mocked A'

在这种情况下,代码在 a = A(分配类,而不是创建实例)下可以工作,因为那样的话,a.method_a()就会触发您的 mock 方法。

如果要模仿一个对象,我使用以下语法:

@mock.patch.object(
a.A,
'method_a',
lambda a: "Mocked A")
def test_method_b(self):
b = a.B()
b.method_b()

在本例中,lambda 函数对 method _ a 进行了模拟。