如何用Mock为带重试逻辑的递归Python函数编写单元测试
正确实现单元测试的方法
你的测试用例问题在于side_effect设置成了Exception,这会让每次调用requests.get都抛出异常,无法触发第二次调用成功的场景。要实现「第一次抛异常、第二次返回成功响应」的测试场景,需要给side_effect传入一个列表,列表元素依次对应每次调用的返回/抛出结果。
正确的测试代码
import unittest from unittest import mock # 请根据你的实际代码路径调整导入 from your_module import MyClass class TestAbc(unittest.TestCase): @mock.patch('requests.get') def test_abc_retry_success(self, get_mock): # 构造Mock响应对象,设置状态码为200 mock_response = mock.Mock() mock_response.status_code = 200 # 定义调用行为:第一次抛异常,第二次返回成功响应 get_mock.side_effect = [Exception, mock_response] test_url = "https://example.com" result = MyClass.abc(test_url) # 验证requests.get的调用次数为2 self.assertEqual(get_mock.call_count, 2) # 验证返回的状态码符合预期 self.assertEqual(result, 200) if __name__ == '__main__': unittest.main()
关键说明
side_effect = [Exception, mock_response]:列表的第一个元素对应第一次调用requests.get的行为(抛出异常),第二个元素对应第二次调用的行为(返回模拟的响应对象)。- 不需要
assertRaises断言,因为第二次调用成功后函数会正常返回200,不会抛出异常。 - 注意
patch的路径正确性:如果你的abc函数在某个模块中直接导入了requests,需要确保patch的是该模块内的requests.get(比如@mock.patch('your_module.requests.get')),而非全局的requests.get,否则Mock不会生效。
内容的提问来源于stack exchange,提问作者Anubhav
相关产品推荐
相关产品推荐

