如何mock requests.post返回值使其同时包含status_code和__dict__属性
问题原因
你在调用Mock构造函数时传入的__dict__参数,会被识别为普通自定义属性,而非覆盖Mock实例本身的特殊属性__dict__。而直接给mock_post.return_value.__dict__赋值时,会清空Mock实例原本的属性存储字典,导致提前设置的status_code丢失。
可行实现方案
方案1:直接将所需属性全部写入__dict__
赋值时把status_code也放入自定义的属性字典即可:
@patch("tests.requests.post", autospec=True) def test_create_job(self, mock_post): mock_response = Mock() mock_response.__dict__ = {"status_code": 200, "a": "b"} mock_post.return_value = mock_response
方案2:通过标准属性赋值实现(更推荐)
Mock对象的自定义属性默认都会自动存入实例的__dict__中,不需要手动修改__dict__:
@patch("tests.requests.post", autospec=True) def test_create_job(self, mock_post): mock_response = Mock() # 直接赋值的属性会自动进入__dict__ mock_response.status_code = 200 mock_response.a = "b" mock_post.return_value = mock_response
方案3:模拟真实requests.Response结构(可选)
如果需要更贴合真实返回的属性校验,可以用spec绑定requests的Response类:
from requests import Response @patch("tests.requests.post", autospec=True) def test_create_job(self, mock_post): mock_response = Mock(spec=Response) mock_response.status_code = 200 mock_response.a = "b" mock_post.return_value = mock_response
以上三种方案都可以同时满足返回值携带status_code属性,且__dict__中包含对应自定义键值的需求。
内容的提问来源于stack exchange,提问作者fege
相关产品推荐
相关产品推荐

