Python returns MagicMock 对象而不是 return_value

Python returns MagicMock object instead of return_value

我有一个 python 文件 a.py,其中包含两个 classes 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()

我想通过模拟 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() - 即 amock_areturn_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 函数模拟。