如何Mock两次相同GET请求以返回不同结果并测试指定异常
实现两次Mock相同GET请求返回不同结果的正确方式
你当前的问题在于重复patch同一个requests.get对象,装饰器的执行顺序是从下往上,后一个patch会覆盖前一个,所以实际上只有最后一个mock生效,无法实现两次调用返回不同结果的需求。
要实现第一次请求成功、第二次抛出RequestException的效果,只需要单次patch,并利用side_effect的列表特性即可——side_effect接收列表时,会按列表顺序依次返回对应结果(或抛出异常),正好匹配你两次requests.get的调用顺序。
修改后的测试代码
@patch("argo_probe_poem.poem_cert.requests.get") def test_raise_request_exception(self, mock_requests): # 第一个元素对应第一次requests.get的返回,第二个对应第二次抛出异常 mock_requests.side_effect = [pass_web_api, requests.exceptions.RequestException] with self.assertRaises(SystemExit) as e: utils_func(self.arguments) self.assertEqual(e.exception.code, 2)
原理说明
你的业务代码中,第一次调用requests.get('https://hostname_1')会触发side_effect列表的第一个元素pass_web_api,模拟请求成功;循环中第二次调用requests.get('https://host_2')会触发列表的第二个元素,抛出RequestException,正好命中你要测试的异常分支。
如果后续有更多次调用需求,只需要在side_effect列表中追加对应的返回值或异常即可。
内容的提问来源于stack exchange,提问作者dean89
相关产品推荐
相关产品推荐

