如何mock requests.get返回指定HTTP状态码 为无返回值函数编写单元测试
解决方案
可以直接用Python标准库自带的unittest.mock模拟requests.get的返回值,哪怕被测函数没有返回值,也可以通过验证调用逻辑、捕获打印输出来完成单元测试。
首先先修正你示例代码的语法错误:原代码中else 401 == response.status_code需要改为elif 401 == response.status_code,否则会触发语法报错。
测试用例示例
import unittest from unittest import mock from foo import getData # 导入你写的getData函数 class TestGetData(unittest.TestCase): # 配置捕获标准输出的前置/后置逻辑 def setUp(self): import sys from io import StringIO self.original_stdout = sys.stdout self.output_buffer = StringIO() sys.stdout = self.output_buffer def tearDown(self): import sys sys.stdout = self.original_stdout self.captured_output = self.output_buffer.getvalue() @mock.patch("foo.requests.get") def test_200_status(self, mock_get): # 构造返回200状态码的mock响应 mock_resp = mock.Mock() mock_resp.status_code = 200 mock_resp.json.return_value = {"data": "test"} mock_get.return_value = mock_resp # 调用被测函数 getData() # 验证逻辑 mock_get.assert_called_once() # 验证requests.get确实被调用 self.assertEqual(self.captured_output.strip(), "success") # 验证输出符合预期 @mock.patch("foo.requests.get") def test_401_status(self, mock_get): # 构造返回401状态码的mock响应 mock_resp = mock.Mock() mock_resp.status_code = 401 mock_resp.json.return_value = {"error": "unauthorized"} mock_get.return_value = mock_resp getData() # 验证逻辑 mock_get.assert_called_once() self.assertEqual(self.captured_output.strip(), "401") if __name__ == "__main__": unittest.main()
注意事项
mock.patch的路径需要匹配被测模块内的引用路径:如果getData函数在foo.py内,就写@mock.patch("foo.requests.get"),不要直接patch全局的requests.get- 你也可以额外验证
mock_get的调用参数是否符合预期,比如是否传入了正确的url和headers,示例:mock_get.assert_called_once_with(run_task_status_url, headers=iics_job_header) - 如果使用
pytest测试框架,不需要手动配置setUp/tearDown捕获输出,直接用自带的capsysfixture即可。
内容的提问来源于stack exchange,提问作者user1591156
相关产品推荐
相关产品推荐

