创建一个正常运行的Response对象

时间:2016-11-01 13:43:34

标签: python python-requests

出于测试目的,我正在尝试在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对象?

4 个答案:

答案 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')

    ...