Может ли конструктор python быть посмеянным без насмешки над другими свойствами объекта?

Можно ли издеваться над конструктором python, продолжая использовать производственную версию других полей /функций с тем же именем? Например, учитывая производственный код:

 class MyClass:
    class SubClass:
        def __init__(self) -> None:
            print("\nreal sub init called")

        class SubSubClass:
            def __init__(self) -> None:
                print("\nreal sub sub init called")

и следующий тестовый код:

 class FakeSubClass:
    def __init__(self) -> None:
        print("\nfake init called")


def test():
    MyClass.SubClass()
    MyClass.SubClass.SubSubClass()

    MyClass.SubClass = Mock(side_effect=FakeSubClass)

    MyClass.SubClass()
    MyClass.SubClass.SubSubClass()

мы получаем следующий вывод:

real sub init called

real sub sub init called

fake init called

Обратите внимание, что в последней строке MyClass.SubClass.SubSubClass() не было создано реального SubSubClass, поскольку на данный момент это автоматически созданное свойство макета SubClass .

Мой желаемый результат следующий:

real sub init called

real sub sub init called

fake init called

real sub sub init called

Другими словами, я хочу высмеивать ТОЛЬКО подкласс, но не подкласс. Вещи, которые я попробовал вместо насмешливой строки выше (обе из которых не работают):

MyClass.SubClass.__init__ = Mock(side_effect=FakeSubClass.__init__)

MyClass.SubClass.__new__ = Mock(side_effect=FakeSubClass.__new__)

Обратите внимание, что мне известно о нескольких способах рефакторинга кода, чтобы избежать этой проблемы, но, к сожалению, код не может быть реорганизован.

4 голоса | спросил tonicsoft 27 J0000006Europe/Moscow 2018, 15:53:42

2 ответа


0
Вы также можете подделать класс, вещь ---- +: = 0 =: + ---- не сработает в вашем случае, если ---- +: = 1 =: + ---- это Mock dontесть ---- +: = 2 =: + ---- определение.Просто позвольте ---- +: = 3 =: + ---- унаследовать его от MyClass. SubClass решит проблему.И вы можете легко исправить ---- +: = 4 =: + ---- to ---- +: = 5 =: + ---- , и вы получите правильный тестовый объект, а не реальный объект.
ответил ZhouQuan 5 J000000Thursday18 2018, 13:10:56
0
Я согласен, что у ZhouQuan есть очень хороший ответ, так как он будет работать для любого метода или переменной в ---- +: = 0 =: + ---- .Тем не менее, вот некоторые варианты, которые могут или не могут быть полезны.Если по какой-либо причине ---- +: = 1 =: + ---- не может быть отредактировано напрямую, или вы хотите только унаследовать ---- +: = 2 =: + ----, но больше ничего, это можно изменить в ---- +: = 3 =: + ---- вот так.Думаю, стоит отметить, что ---- +: = 5 =: + ---- принимает аргумент ---- +: = 6 =: + ---- , который можно использовать для получения аналогаповедение, хотя это не совсем то, что вы просили.Вот пример.Это дает другой результат.
ответил The Matt 9 J000000Monday18 2018, 17:03:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132