Есть ли способ имитировать isinstance() объекта в python?

#python #inheritance #mocking #invoke #isinstance

#python #наследование #издевательство #вызвать #isinstance

Вопрос:

Я хочу написать макет для объекта библиотеки, не наследуя от него, чтобы правильно протестировать, однако без необходимости заглушки всех неиспользуемых функций исходного объекта.

Чтобы быть точным, я хочу написать ContextMock для библиотеки invoke .

 class ContextMock:
    ...
  

Основная проблема здесь в том, что я для этого вызываю функцию @task, которая затем вызывает мой код, который я хочу протестировать. Однако декоратор @task проверяет, является ли объект контекста экземпляром контекста, например:

 def __call__(self, *args, **kwargs):
    # Guard against calling tasks with no context.
    if not isinstance(args[0], Context):
        err = "Task expected a Context as its first arg, got {} instead!"
        # TODO: raise a custom subclass _of_ TypeError instead
        raise TypeError(err.format(type(args[0])))
  

Поэтому мой вопрос в том, могу ли я как-то изменить функцию isinstance моего ContextMock или сделать ее похожей на экземпляр Context без наследования его атрибутов?
Или можно было бы как-то издеваться над функцией isinstance?
Как работает реализация instancecheck по умолчанию? Есть ли в perhabs атрибут базового класса, который можно перезаписать?

Я уже пытался предоставить пользовательский метакласс с пользовательской функцией instancecheck, которая, конечно, не работает при вызове instancecheck контекста, верно?

Также обратите внимание, что я хорошо знаю, что любое хакерское решение не должно принадлежать производственному коду и используется только для тестирования.

Редактировать: добавить общий пример того, что я хочу заархивировать:

 class Context:
    pass

class ContextMock: 
    pass

mock = ContextMock

... do magic with mock

assert isinstance(mock, Context)
  

Комментарии:

1. Способ архивировать желаемое поведение — позволить ContextMock наследовать от unittest.mock . Издевайтесь, а затем вызывайте его конструктор с помощью spec=Context . Все же было бы неплохо понять, как это делает макет / есть ли более приятный способ