Продолжаю разбираться с этой бедой, и вот, что имею (Python 2.7):

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-м варианте, что в принципе добился, но ещё не до конца протестил на настоящих модулях и классах (да, оно связано с предыдущим вопросом). Или может подскажете хотя бы нормальный гайд, ибо в оффициальной документации таких интересных случаев не разбирают.