如何在Django TestCase中mock PyActiveResource的UnauthorizedAccess响应
问题原因
你遇到的两个报错本质都是因为UnauthorizedAccess的构造逻辑和Response类的设计不符合你的预期:
- 使用
MagicMock模拟响应时,PyActiveResource内部会调用传入响应对象的read()方法提取body,你只给mock对象设置了body属性,没有配置read()方法的返回值,所以最终body显示为MagicMock对象。 - 直接实例化
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
相关产品推荐
相关产品推荐

