Python Mock测试:如何替换修改传入对象的无返回值函数?
如何Mock无返回值但会修改传入对象的方法?
你需要测试的method_to_mock因依赖仓库外的大型文件无法在单元测试中运行,但它的核心逻辑是修改传入对象的status字段——正常执行时设为COMPLETE,异常时设为FAILED。可以用Python标准库的unittest.mock来Mock这个方法,直接模拟它修改对象属性的行为,完全避开无法运行的process调用。
解决方案示例
假设你的测试用例基于unittest.TestCase,可以通过mock.patch配合side_effect来实现:
1. 模拟正常执行(status设为COMPLETE)
from unittest import TestCase, mock class FileWrapperTest(TestCase): def test_process_file_wrapper_complete(self): file_wrapper_object = create_wrapper_object(arbitrary_data) # 替换目标方法为Mock with mock.patch('your_module.method_to_mock') as mock_method: # 定义Mock的副作用:修改传入对象的status mock_method.side_effect = lambda obj: setattr(obj, 'status', "COMPLETE") # 调用被测试逻辑(这里直接调用mock后的method_to_mock) method_to_mock(file_wrapper_object) # 验证结果 self.assertEqual(file_wrapper_object.status, "COMPLETE")
2. 模拟异常情况(status设为FAILED)
如果需要测试异常分支的行为,只需要修改side_effect的逻辑:
def test_process_file_wrapper_failed(self): file_wrapper_object = create_wrapper_object(arbitrary_data) with mock.patch('your_module.method_to_mock') as mock_method: mock_method.side_effect = lambda obj: setattr(obj, 'status', "FAILED") method_to_mock(file_wrapper_object) self.assertEqual(file_wrapper_object.status, "FAILED")
关键说明
mock.patch的参数要写目标方法的完整模块路径,比如your_module.method_to_mock,确保替换的是被测试代码实际导入的那个函数实例。side_effect可以接收一个函数,这个函数会接收原方法的所有参数,你可以在函数里直接修改传入的对象属性,完美模拟原方法的行为。- 逻辑更复杂时,也可以用普通函数代替lambda:
def mock_complete(obj): obj.status = "COMPLETE" mock_method.side_effect = mock_complete
内容的提问来源于stack exchange,提问作者IAmVerySmart
相关产品推荐
相关产品推荐

