python - 有没有办法在 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)
解决方案
推荐阅读
- angular - 我正在尝试获取表单数组中的所有值,但出现错误或未获取数组中的所有值
- swift - 协议 {get set} :协议中的 get 和 set 允许和禁止什么?迅速
- sql - 将 Athena SQL 与正则表达式一起使用
- angular - 角度数据表分页不起作用或搜索
- data-science - 如何处理无法分组或删除的分类变量?
- javascript - Grunt add @import path to js file
- r - 将字符转换为因子 R
- python - 将熊猫数据框行转换为列表
- assembly - 微处理器:我有一个问题,我不知道下一步该做什么。
- javascript - 如何在 Next.js 中删除默认加载指示器