127

我有一个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'>

我在哪里做错了?

4

1 回答 1

160

@mock.patch('a.A')A使用mock_a.

B.method_b你 then seta = A()中,也就是 now a = mock_a()-ie ais the return_valueof mock_a。由于您尚未指定此值,因此它是常规的MagicMock; MagicMock这也没有配置,因此在调用它的方法时会得到默认响应(又一个)。

相反,您希望将 of 配置return_value具有mock_a适当的方法,您可以这样做:

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()会触发您的模拟方法。

于 2016-07-05T09:05:29.030 回答