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

Python API测试Mock使用问题:单元测试报错排查

单元测试代码中的问题分析

核心问题梳理

  • Mock目标完全错误:你当前patch的是要测试的MyClass.get_access_token方法本身,这等于直接跳过原方法的业务逻辑,完全失去了单元测试的意义。正确的做法是Mock外部依赖requests.post——原方法的核心逻辑是调用这个第三方接口获取token,我们需要Mock这个接口的返回,来验证原方法的处理逻辑。
  • 类导入方式错误:原文件是myclass.py,测试代码里import MyClass会把整个模块导入,而非模块内的MyClass类,实例化时会直接抛出类型错误。正确写法是from myclass import MyClass。
  • 返回值断言与Mock设置不匹配:
    • 原方法get_access_token返回的是从响应中提取的access_token字符串,而非响应对象,但你却断言response.status_code——字符串没有这个属性,必然触发属性错误。
    • 原方法通过response.json().get('access_token')获取值,你设置的_access.return_value.json.return_value = mock_access_token不符合数据结构,应该让json返回包含access_token字段的字典。

修正后的测试代码示例

import os
import unittest
from unittest.mock import patch, MagicMock
from myclass import MyClass  # 修正类导入方式

class TestModule(unittest.TestCase):
    def test_execute(self):
        # 模拟环境变量,避免依赖真实环境配置
        with patch.dict(os.environ, {'username': 'test_user', 'password': 'test_pass'}):
            _obj = MyClass(login_url="https://www.my-website.com/login/")

        mock_access_token = "abc123def456ghi789"
        # 正确Mock myclass模块内的requests.post方法
        with patch('myclass.requests.post') as mock_post:
            # 构造符合原方法逻辑的Mock响应对象
            mock_response = MagicMock()
            mock_response.status_code = 200
            mock_response.json.return_value = {'access_token': mock_access_token}
            mock_post.return_value = mock_response

            # 调用原方法
            result_token = _obj.get_access_token()

            # 断言返回的token值正确
            self.assertEqual(result_token, mock_access_token)
            # 可选:验证requests.post是否按预期参数调用
            mock_post.assert_called_once_with(
                "https://www.my-website.com/login/",
                json={'name': 'test_user', 'password': 'test_pass'},
                headers={
                    'Authorization': 'Bearer ',
                    'Content-Type': 'application/json',
                    'Accept': 'application/json'
                },
                verify=False
            )

if __name__ == "__main__":
    unittest.main()

内容的提问来源于stack exchange,提问作者SHM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:35:18