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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:40:04