Как сделать так, чтобы произвольные вложенные атрибуты / методы поддельного объекта возвращали указанные c значения в Python? - PullRequest
2 голосов
/ 21 апреля 2020

Допустим, я создаю фиктивный объект:

mocked = MagicMock()

И я бы хотел установить для всех mocked экземпляров всех произвольных вложенных атрибутов / методов экземпляр, возвращающий указанные c значения:

mocked = MagicMock()
# mock.all_return_value = 'expected'
# so calling the following will return `expected`
mocked.a.b.c.d()

Возможно ли это?

1 Ответ

1 голос
/ 21 апреля 2020

Вы можете создавать подклассы и переопределять _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
...