测试中如何Mock基类的实例属性?(附代码示例)
解决测试场景下修改基类实例属性的问题
我来给你几个实用的方案,都是在测试中修改app.base.attr的常用方法,你可以根据自己的测试场景选择:
方案1:直接修改实例属性(最简单直接)
如果你的测试代码已经初始化了App实例,那直接修改它内部Base实例的属性就完事了,完全不需要额外的Mock工具:
# test_app.py from app import App def test_modify_attr_directly(): app = App() # 直接修改已创建的Base实例的attr属性 app.base.attr = 'new_value' app.base.show() # 此时会打印 'new_value'
这种方法的优势就是直观、零额外依赖,适合只需要临时修改单个实例属性的简单场景。
方案2:用unittest.mock.patch临时替换属性
如果你需要在测试期间临时替换属性,并且希望测试结束后自动恢复原属性值(避免影响其他测试用例),可以用Python标准库的unittest.mock.patch:
方式A:直接patch目标实例的属性
from unittest.mock import patch from app import App def test_mock_instance_attr(): app = App() # 临时将app.base.attr替换为'new_value' with patch.object(app.base, 'attr', 'new_value'): app.base.show() # 打印 'new_value' # 离开with代码块后,attr会自动恢复为'original_value'
方式B:patch Base类的初始化逻辑(适合提前指定属性)
如果你想在创建App实例时就让内部的Base实例拥有指定的attr,可以patchBase的__init__方法:
from unittest.mock import patch from app import App, Base def test_mock_base_init(): with patch.object(Base, '__init__', return_value=None) as mock_init: app = App() # 手动给Base实例设置attr属性 app.base.attr = 'new_value' app.base.show() # 打印 'new_value'
方案3:用pytest的monkeypatch fixture(pytest用户首选)
如果你用pytest作为测试框架,可以用它自带的monkeypatch fixture来修改属性,同样支持自动恢复:
import pytest from app import App def test_modify_with_monkeypatch(monkeypatch): app = App() # 用monkeypatch设置目标属性 monkeypatch.setattr(app.base, 'attr', 'new_value') app.base.show() # 打印 'new_value'
总结
- 简单场景选方案1,直接修改最省事;
- 需要属性自动恢复、隔离测试环境的话,选方案2或方案3(根据你用的测试框架来)。
内容的提问来源于stack exchange,提问作者Jordan Lee
相关产品推荐
相关产品推荐

