Как я могу издеваться над всем, кроме одного метода класса Python? - PullRequest
0 голосов
/ 22 января 2020

Скажем, у меня большой класс, подобный этому:

class LargeClass(object):
    @classmethod
    def method_1(cls):
        cls.method_2()
        print("method1")

    @classmethod
    def method_2(cls):
        print("method2")
    ...
    @classmethod
    def method_10(cls):
        print("method10")

Я хочу высмеивать все, кроме одного метода этого класса. Нюанс в том, что этот немодированный метод должен иметь возможность вызывать другие ложные методы. Примерно так:

mock = mock.create_autospec(LargeClass)
mock.method_1 = LargeClass.method_1
mock.method_1()
mock.method_2.assert_called_once()

Проблема здесь в том, что строка mock.method_1 = LargeClass.method_1 не делает то, что я хочу. Когда я затем вызываю mock.method_1, cls, передаваемый «реальному» методу_1, происходит от объекта LargeClass, а не от поддельного объекта. Таким образом, mock.method_2.assert_called_once() терпит неудачу, потому что вызывается реальный метод класса, а не метод проверяемого класса.

Как можно смоделировать все методы в этом классе, кроме одного?

Я также пытался mock.method_1 = LargeClass.method_1(mock) за этот ответ , но это не удается из-за слишком большого количества аргументов.

...