You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:00:16