1)
from mock import Mock, patch, create_autospec class A(object): def func1(self, arg): return arg class B(object): def func1(self, arg): a = A() return "=== %s ===" % a.func1(arg) b = B() print b.func1("hello") # === hello === mocked_A = create_autospec(A) ma = mocked_A() print ma.func1("hello") # <MagicMock bla-bla-bla'> ma.func1.return_value = "world" print ma.func1("hello") # world globals()['A'] = mocked_A b = B() print b.func1("hello") # === world ===
Вывод:
=== hello === <MagicMock name='mock().func1()' id='3070641676'> world === world ===
2) если же, вместо
ma.func1.return_value = "world"
mocked_A.func1.return_value = "world"
from mock import Mock, patch, create_autospec class A(object): def func1(self, arg): return arg class B(object): def func1(self, arg): a = A() return "=== %s ===" % a.func1(arg) b = B() print b.func1("hello") # === hello === mocked_A = create_autospec(A) ma = mocked_A() print ma.func1("hello") # <MagicMock bla-bla-bla'> mocked_A.func1.return_value = "world" print ma.func1("hello") # world globals()['A'] = mocked_A b = B() print b.func1("hello") # === world ===
Вывод:
=== hello === <MagicMock name='mock().func1()' id='3070903788'> <MagicMock name='mock().func1()' id='3070903788'> === <MagicMock name='mock().func1()' id='3070903788'> ===
Видимо, Я здесь что-то недопонял. Как же так работает этот mock? Почему? Мне нужно поведение, как в 1-м варианте, что в принципе добился, но ещё не до конца протестил на настоящих модулях и классах (да, оно связано с предыдущим вопросом). Или может подскажете хотя бы нормальный гайд, ибо в оффициальной документации таких интересных случаев не разбирают.