有没有一种方法可以在python中模拟对象的isinstance?

问题描述

我想为库对象编写一个模拟程序而不继承它,以便进行正确的测试,但是不必对原始对象的所有未使用的函数进行存根。

具体来说,我想为调用库编写一个ContextMock。

class ContextMock:
    ...

这里的主要问题是为此我调用了@task函数,然后调用了我要测试的代码。但是@task装饰器会检查上下文对象是否是Context的实例,如下所示:

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])))

因此,我的问题是,我可以以某种方式更改ContextMock的isinstance函数,还是使其在不继承其属性的情况下看起来像Context的实例吗? 还是有可能以某种方式模拟isinstance函数? instancecheck 的默认实现如何工作?是否存在可以覆盖的基类属性?

我已经尝试为自定义元类提供自定义的 instancecheck 函数,因为调用Context的 instancecheck ,这当然不起作用,对吧?>

还请注意,我很清楚,任何hacky解决方案都不应该属于生产代码,而只能用于测试。

编辑: 要添加我要存档的通用示例:

class Context:
    pass

class ContextMock: 
    pass

mock = ContextMock

... do magic with mock

assert isinstance(mock,Context)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...