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()


Я хотел бы объединить 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'>


Где я делаю неправильно?

526   1  

1 ответ:

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

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

Вместо этого вы хотите настроить 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() запустил бы ваш фиктивный метод.

Comments

    Ничего не найдено.