Вы можете создавать подклассы и переопределять _get_child_mock () .
Он предназначен для переопределения подклассами, чтобы возвращать пользовательские значения для свойств:
_get_child_mock (** kw)
Создание дочерних макетов для атрибутов и возвращаемого значения. По умолчанию дочерние макеты будут иметь тот же тип, что и родительский. Подклассы Mock могут захотеть переопределить это, чтобы настроить способ создания дочерних насмешек.
Если вы сделаете так, чтобы он возвратил новый экземпляр и установил return_value
, вы должны получить желаемый эффект:
class NestMock(MagicMock):
def _get_child_mock(self, **kw):
return NestMock(return_value = kw['parent'].return_value)
m = NestMock(return_value="expected")
m() # 'expected'
m.a.b() # 'expected'
m.call_count # 1
m.a.b.call_count # 1
m.c.call_count # 0