为含autospec依赖的对象添加类型提示的解决方案问询
问题:autospec模拟依赖时的类型提示痛点
我在为带依赖的控制器对象编写测试,为避免实例化数据库连接这类依赖,用create_autospec模拟InterfaceB。
控制器代码
class A: def __init__(self, some_dependency: InterfaceB): self.some_dependency: InterfaceB = some_dependency def do_thing(self, x): self.some_dependency.do_subtask(necessary_data=x)
测试代码
def test_do_thing(): a: A = A(some_dependency=create_autospec(InterfaceB)) a.do_thing(1) assert a.some_dependency.do_subtask.called_with(necessary_data=1)
问题描述
代码补全/检查工具(如PyCharm)会报错,认为do_subtask是普通函数,不存在called_with属性。必须通过cast转换才能消除报错:
do_subtask: Mock = cast(Mock, a.some_dependency.do_subtask) assert do_subtask.called_with(necessary_data=1)
但这种方式在多依赖或需调用依赖多个方法的场景下非常繁琐,违反DRY原则。
解决方案需求(按优先级排序)
- 自动识别
A的类型,且其所有autospec依赖的方法均为Mock类型; - 通过类型提示标识变量为某类型的autospec,即拥有该类型全部方法但实际为
Mock对象; - 向PyCharm检查工具声明Mock的更简洁方式。
内容的提问来源于stack exchange,提问作者Lachlan
相关产品推荐
相关产品推荐

