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

如何在Django TestCase中mock PyActiveResource的UnauthorizedAccess响应

问题原因

你遇到的两个报错本质都是因为UnauthorizedAccess的构造逻辑和Response类的设计不符合你的预期:

  1. 使用MagicMock模拟响应时,PyActiveResource内部会调用传入响应对象的read()方法提取body,你只给mock对象设置了body属性,没有配置read()方法的返回值,所以最终body显示为MagicMock对象。
  2. 直接实例化Response传入异常时,UnauthorizedAccess构造函数默认会将传入的第一个参数当成标准httplib.HTTPResponse对象,调用Response.from_httpresponse方法解析,而你传入的Response实例本身没有read()方法,所以触发属性错误。

解决方法

方法1:补全MagicMock的必要方法(推荐)

完全模拟标准HTTPResponse的行为,符合PyActiveResource的内部处理逻辑:

from pyactiveresource.connection import UnauthorizedAccess
from unittest.mock import MagicMock, patch

class TestFoo(TestCase):
    def test_exception_unauthorized_access(self):
        foo = SomeThingFactory()
        mock_resp = MagicMock()
        mock_resp.code = 401
        # 配置read方法返回你需要的body内容,注意httplib的read返回字节类型
        mock_resp.read.return_value = b'{"errors": "Login or wrong password"}'
        mock_resp.msg = "Unauthorized"
        mock_resp.headers = {}

        with patch('module.MyTestClass.myfunction', side_effect=UnauthorizedAccess(mock_resp)):
            foo.function_that_call_myfuncion()
        
        # 后续断言逻辑
        ...

方法2:手动构造异常对象,跳过自动解析

直接给UnauthorizedAccess实例赋值已经构造好的Response对象,绕开内部的HTTP响应解析逻辑:

from pyactiveresource.connection import UnauthorizedAccess, Response
from unittest.mock import patch

class TestFoo(TestCase):
    def test_exception_unauthorized_access(self):
        foo = SomeThingFactory()
        # 直接构造符合要求的Response实例
        custom_resp = Response(
            code=401,
            body='{"errors": "Login or wrong password"}',
            headers={},
            msg="Unauthorized"
        )
        # 手动给异常赋值response属性,不走内部解析逻辑
        exc = UnauthorizedAccess()
        exc.response = custom_resp

        with patch('module.MyTestClass.myfunction', side_effect=exc):
            foo.function_that_call_myfuncion()
        
        # 后续断言逻辑
        ...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:24:04