pytest同时使用parametrize和mock.patch报参数数量错误是什么原因?
错误原因及修复方案
核心原因
该参数数量不匹配报错最可能由两个问题导致:
- 你使用了unittest自带的测试运行器执行用例:如果测试类继承自
unittest.TestCase,unittest默认不识别@pytest.mark.parametrize装饰器,不会注入a、b两个参数,最终只会传入self和三个mock对象,合计4个参数,和你定义的6个参数数量不符,就会抛出该错误。 - 装饰器顺序不符合规范:
@pytest.mark.parametrize需要放在所有@mock.patch装饰器的下方(更靠近测试函数的位置),你当前把参数化装饰器写在最上方,会导致参数注入顺序混乱、甚至参数缺失。
修复方法
- 改用pytest作为测试运行器执行用例,不要使用unittest的默认运行器
- 调整装饰器顺序,同时确认mock参数的注入顺序符合从下到上的规则(最靠近函数的patch装饰器对应第一个mock参数),调整后的代码示例如下:
@mock.patch('path_to_mocked_function3') @mock.patch('path_to_mocked_function2') @mock.patch('path_to_mocked_function1') @pytest.mark.parametrize('a, b', [ (5, 8), ]) def test_function(self, mocked1, mocked2, mocked3, a, b): mocked1.return_value = a mocked2.return_value = None mocked3.return_value = b output = export(**self.args).to_json() self.assertEqual(output, 5)
额外提示:如果你的测试函数没有写在测试类中,需要把参数列表里的
self删除,否则也会出现参数数量不匹配的问题。
内容的提问来源于stack exchange,提问作者Dor Ben zvi
相关产品推荐
相关产品推荐

