Python возвращает объект MagicMock вместо возвращаемого значения

у меня есть файл python a.py, который содержит два класса 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()

Я хотел бы unittest 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 на выходе. Но вот что я получаю:--12-->

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

где я делаю не так?

1 ответов


когда вы @mock.patch('a.A'), вы заменяете класс A в тестируемом коде с mock_a.

на B.method_b затем вы установите a = A(), который сейчас a = mock_a() - то есть a - это return_value of mock_a. Поскольку вы не указали это значение, это обычный MagicMock; это также не настроено, поэтому вы получаете ответ по умолчанию (еще один MagicMock) при вызове методов на нем.

вместо этого вы хотите настроить the 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 (присвоение класса, а не создание экземпляра), как тогда a.method_a() вызвало бы ваш макет метода.