出于测试目的,我正在尝试在python中创建一个Response()对象,但事实证明它听起来更难。
我试过这个:
from requests.models import Response
the_response = Response()
the_response.code = "expired"
the_response.error_type = "expired"
the_response.status_code = 400
但是当我尝试the_response.json()
时出现错误,因为该函数试图获取len(self.content)
并且a.content
为空。
所以我设置了a._content = "{}"
,但后来我遇到了编码错误,所以我必须更改a.encoding
,但是它无法解码内容....
这种情况一直持续下去。有没有一种简单的方法来创建一个功能齐全且具有任意status_code和内容的Response对象?
答案 0 :(得分:24)
那是因为_content
对象(在python3上)的Response
属性必须是字节而不是unicodes。
以下是如何操作:
from requests.models import Response
the_response = Response()
the_response.code = "expired"
the_response.error_type = "expired"
the_response.status_code = 400
the_response._content = b'{ "key" : "a" }'
print(the_response.json())
答案 1 :(得分:13)
创建一个mock
对象,而不是尝试构建一个真实的对象:
DISTINCT
如果您尝试访问真实from unittest.mock import Mock
from requests.models import Response
the_response = Mock(spec=Response)
the_response.json.return_value = {}
the_response.status_code = 400
没有的方法和属性,则提供spec
可确保模拟会投诉。
答案 2 :(得分:3)
只需使用responses
库为您执行此操作:
import responses
@responses.activate
def test_my_api():
responses.add(responses.GET, 'http://whatever.org',
json={}, status=400)
...
这样做的好处是可以拦截真实的请求,而不必在某处注入响应。
答案 3 :(得分:0)
使用 requests_mock
库的另一种方法,这里使用提供的装置:
import requests
def test_response(requests_mock):
requests_mock.register_uri('POST', 'http://test.com/', text='data', headers={
'X-Something': '1',
})
response = requests.request('POST', 'http://test.com/', data='helloworld')
...