Скажем, у меня большой класс, подобный этому:
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)
за этот ответ , но это не удается из-за слишком большого количества аргументов.