如何在Python 3.x中用pytest MonkeyPatch被继承的混入类
解决pytest中对被继承混入类的MonkeyPatch问题
针对你遇到的场景,有两种可靠的解决方式:
方式一:直接修改父类A的目标方法
因为B的foo方法是继承自A,直接patch A类的foo方法,会让所有继承A的子类(包括B)自动使用修改后的方法。
示例代码:
def test_B(monkeypatch): def mock_foo(cls) -> str: return 'bar' # 直接替换A类的foo类方法 monkeypatch.setattr(A, 'foo', classmethod(mock_foo)) # 验证效果 assert B.foo() == 'bar'
方式二:修改子类B的继承基类
如果你需要完全替换A类的行为而非单个方法,可以修改B的__bases__属性,将原父类A替换为你的MockA。
示例代码:
def test_B(monkeypatch): class MockA: @classmethod def foo(cls) -> str: return 'bar' # 将B的基类从A替换为MockA monkeypatch.setattr(B, '__bases__', (MockA,)) # 验证效果 assert B.foo() == 'bar'
原方法无效的原因说明
- 直接patch
B.foo时,若B未显式定义foo,Python会优先从父类A查找该方法;如果你的patch路径(如字符串'B.foo')不正确,或者未显式在B上覆盖该方法,就不会生效。 - 替换整个
A类时,B的继承关系在类定义时就已确定(绑定了原A的引用),后续替换全局的A变量不会改变B已有的继承链,因此B仍会使用原A的方法。
内容的提问来源于stack exchange,提问作者Moad Ennagi
相关产品推荐
相关产品推荐

