使用unittest mock.patch测试Python接口调用时遇AttributeError错误求助
问题原因
你写的call_api函数返回的是response.json()(一个字典对象),但测试代码里却试图访问返回值的status_code属性——字典根本没有这个属性,所以抛出AttributeError。
解决方法
根据你的测试目标,有两种修正方向:
方向1:验证函数是否正确处理了状态码
如果你想测试函数在状态码为200时的行为(比如打印"Everything is good"),可以通过捕获打印输出、验证mock调用的方式实现:
from unittest import TestCase, main, mock from my_module import call_api import io import sys class MyModuleTest(TestCase): @mock.patch("my_module.requests.post") def test_call_api(self, mock_request_post): mock_res = mock.Mock(status_code=200) mock_res.json.return_value = { "result": [ { "name": "John Doe" } ] } mock_request_post.return_value = mock_res # 捕获打印输出 captured_output = io.StringIO() sys.stdout = captured_output call_api(data={"state": False}) sys.stdout = sys.__stdout__ # 验证状态码判断逻辑生效 self.assertEqual(captured_output.getvalue().strip(), "Everything is good") # 验证请求参数正确 mock_request_post.assert_called_once_with("http://mi6.uk/agents/", data={"state": False})
方向2:验证函数返回的JSON数据
如果你想测试函数返回的JSON内容是否符合预期,直接断言返回的字典即可:
from unittest import TestCase, main, mock from my_module import call_api class MyModuleTest(TestCase): @mock.patch("my_module.requests.post") def test_call_api(self, mock_request_post): expected_json = { "result": [ { "name": "John Doe" } ] } mock_res = mock.Mock(status_code=200) mock_res.json.return_value = expected_json mock_request_post.return_value = mock_res resp = call_api(data={"state": False}) # 断言返回的JSON数据匹配预期 self.assertEqual(resp, expected_json)
额外说明
如果你原本的需求是让call_api返回整个response对象,那需要修改my_module.py里的函数,把return response.json()改成return response——但这取决于你的业务逻辑。
内容的提问来源于stack exchange,提问作者user1972031
相关产品推荐
相关产品推荐

