能否在参数化测试列表中添加待Mock的函数?——实现不同测试用例Mock不同函数的技术问询
解决方案:参数化测试中动态Mock不同函数
当然可以实现你的需求!不需要拆分两个独立测试用例,只需要把要Mock的目标函数路径加入参数化列表,再用unittest.mock.patch的上下文管理器动态处理每个用例的Mock即可。
修改后的测试代码
from parameterized import parameterized from unittest.mock import patch from your_module import do_something # 导入你的业务函数 class TestYourFunction(unittest.TestCase): @parameterized.expand([ ('name1', 1, 2, 'functions.function1'), # 第一个用例Mock function1 ('name2', 2, 2, 'functions.function2') # 第二个用例Mock function2 ]) def test_data(self, _, input_val, expected_output, mock_target): # 动态Mock当前用例指定的目标函数 with patch(mock_target) as mock_func: # given:设置Mock返回值 mock_func.return_value = input_val # when:执行业务逻辑 output = do_something() # then:断言结果 self.assertEqual(output.count(), expected_output)
关键说明
- 参数化扩展:在测试用例列表中新增了
mock_target字段,用来指定当前用例需要Mock的函数路径(注意这个路径必须和do_something()中实际调用function1/function2的导入路径一致,否则Mock不会生效)。 - 动态Mock:放弃了装饰器形式的
@patch,改用上下文管理器with patch(...),这样就能根据参数化传入的mock_target动态切换Mock对象。 - 保持代码简洁:所有测试逻辑复用同一个测试方法,避免了重复代码,同时满足不同用例Mock不同函数的需求。
内容的提问来源于stack exchange,提问作者herder
相关产品推荐
相关产品推荐

