使用pytest测试静态方法时遇参数不匹配错误的原因排查
静态方法Mock时参数不匹配的原因分析
核心问题:实例调用静态方法的隐式传参
你在PrunedGraphWriter的__init__里用self.write_nodes(...)调用静态方法时,Python会自动把self作为第一个参数传入——哪怕这个方法被标记为静态方法。因为通过实例调用方法的语法,和调用普通实例方法完全一致,Python会默认传递实例对象,不管方法本身是不是静态的。
为什么加self就能解决?
当你用monkeypatch替换原静态方法后,mock方法会完全承接原方法的调用场景。原方法是通过self触发的调用,所以每次调用都会先传self,再加上你原本传入的3个参数,总共4个参数。如果mock方法只定义了3个参数,自然会触发TypeError。
两种解决思路
- 思路1:兼容现有调用方式,给mock方法加一个
self参数(哪怕不用):def mock_pruned_graph_write_nodes(self, arg1, arg2, arg3): # 这里写你的验证逻辑 pass - 思路2:修改原代码调用方式,直接用类名调用静态方法,而不是实例:
在PrunedGraphWriter的__init__里改成:
这样调用时就不会传入PrunedGraphWriter.write_nodes(...)self,mock方法只需要定义3个参数即可。
额外补充
Python的@staticmethod装饰器的作用是让方法内部不接收实例参数,但如果通过实例调用这个方法,Python还是会把实例传进去——只是装饰器会把这个参数丢掉,方法内部看不到。但你替换的mock方法没有这个装饰器,所以这个self参数就会被暴露出来,导致参数数量不匹配。
内容的提问来源于stack exchange,提问作者Tim Kirkwood
相关产品推荐
相关产品推荐

