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'>
Где я делаю неправильно?
1 ответ:
Когда вы
@mock.patch('a.A'), вы заменяете классAв тестируемом коде наmock_a.В
B.method_bвы затем устанавливаетеa = A(), который теперьa = mock_a()- то естьaявляетсяreturn_valueизmock_a. Поскольку вы не указали это значение, это обычныйMagicMock; он также не настроен, поэтому вы получаете ответ по умолчанию (еще одинMagicMock) при вызове методов на нем.Вместо этого вы хотите настроить
return_valuemock_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