Python returns MagicMock 对象而不是 return_value
Python returns MagicMock object instead of return_value
我有一个 python 文件 a.py
,其中包含两个 classes A
和 B
.
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()
我想通过模拟 A
在 class B
中对 method_b
进行单元测试。为此目的,文件 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'>
我哪里做错了?
当您 @mock.patch('a.A')
时,您正在用 mock_a
替换被测代码中的 class A
。
然后在 B.method_b
中设置 a = A()
,现在是 a = mock_a()
- 即 a
是 mock_a
的 return_value
。由于您没有指定此值,因此它是一个常规的 MagicMock
;这也没有配置,所以你在调用它的方法时得到默认响应(又一个 MagicMock
)。
相反,您想配置 return_value
of mock_a
以使用适当的方法,您可以按以下任一方式执行:
mock_a().method_a.return_value = 'Mocked A'
# ^ note parentheses
或者,也许更明确地说:
mock_a.return_value.method_a.return_value = 'Mocked A'
您的代码在 a = A
情况下(分配 class,而不是创建实例)会起作用,因为 a.method_a()
会触发您的模拟方法。
在模拟对象的情况下,我使用以下语法:
@mock.patch.object(
a.A,
'method_a',
lambda a: "Mocked A")
def test_method_b(self):
b = a.B()
b.method_b()
在这种情况下,method_a 被 lambda 函数模拟。
我有一个 python 文件 a.py
,其中包含两个 classes A
和 B
.
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()
我想通过模拟 A
在 class B
中对 method_b
进行单元测试。为此目的,文件 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'>
我哪里做错了?
当您 @mock.patch('a.A')
时,您正在用 mock_a
替换被测代码中的 class A
。
然后在 B.method_b
中设置 a = A()
,现在是 a = mock_a()
- 即 a
是 mock_a
的 return_value
。由于您没有指定此值,因此它是一个常规的 MagicMock
;这也没有配置,所以你在调用它的方法时得到默认响应(又一个 MagicMock
)。
相反,您想配置 return_value
of mock_a
以使用适当的方法,您可以按以下任一方式执行:
mock_a().method_a.return_value = 'Mocked A'
# ^ note parentheses
或者,也许更明确地说:
mock_a.return_value.method_a.return_value = 'Mocked A'
您的代码在 a = A
情况下(分配 class,而不是创建实例)会起作用,因为 a.method_a()
会触发您的模拟方法。
在模拟对象的情况下,我使用以下语法:
@mock.patch.object(
a.A,
'method_a',
lambda a: "Mocked A")
def test_method_b(self):
b = a.B()
b.method_b()
在这种情况下,method_a 被 lambda 函数模拟。