Python中MagicMock模拟__contains__方法失效问题排查
问题原因及解决办法
核心问题
- 你测试代码里创建的
mocked_config_obj和some_function内部实例化的config_obj是完全独立的两个对象,你的mock操作根本没作用到函数里的实例上,自然不会被调用。 - 退一步说,就算想mock单个实例的
__contains__方法,直接给实例赋值也是无效的:Python处理in运算符时,会优先从类层面查找__contains__方法,而不是实例的属性字典,所以你给实例挂的mock方法不会被触发。
解决办法
方法一:用patch替换Config类,控制函数内的实例
通过unittest.mock.patch替换Config类,让some_function里创建的是我们预设的mock实例:
from unittest.mock import patch, MagicMock def test_some_function(): # 替换当前模块中的Config类 with patch('__main__.Config') as MockConfig: # 配置mock实例的__contains__方法 mock_config_instance = MockConfig.return_value mock_config_instance.__contains__ = MagicMock(return_value=True) # 执行被测试函数 some_function() # 断言方法被调用 # 注意:这里要替换成你实际判断的entry值 mock_config_instance.__contains__.assert_called_once_with('entry')
方法二:直接mock类的__contains__方法
如果不需要替换整个类,也可以直接patchConfig类的__contains__方法:
from unittest.mock import patch def test_some_function(): # patch Config类的__contains__方法,指定返回值 with patch.object(Config, '__contains__', return_value=True) as mock_contains: # 执行被测试函数 some_function() # 断言方法被调用 mock_contains.assert_called_once()
内容的提问来源于stack exchange,提问作者Marco Mariani
相关产品推荐
相关产品推荐

