当前位置: 首页 > 知识库问答 >
问题:

Python HTTP Post方法将响应作为magicmock对象而不是值返回

林丁雷
2023-03-14

我试图在用POST方法对一些API进行三角化后检查响应状态代码,响应状态代码是Magicmock实例类型,我正在使用比较操作符检查状态代码是否在400和500之间,比较操作符在python 2中工作,但在python 3中引发TypeError

import mock
response = <MagicMock name='Session().post()' id='130996186'>
if (400 <= response.status_code <= 500):
    print('works')

类BMRAPI(对象):root_url=None

    def __init__(self, user, api_key, root_url=BMR_URL,
             api_uri=RESULTS_API_URI):
        self.log = 
        logging.getLogger("BMRframework.Reporting.BMR6.BMRAPI")
        self.root_url = root_url
        self.url = urljoin(root_url, api_uri)
        self.log.info("Connecting to BMR REST API: %s" % self.url)
        self.session = requests.Session()
        auth = 'ApiKey {0}:{1}'.format(user, api_key)
        self.session.headers.update({
            'Content-type': 'application/json',
            'Accept': 'text/plain',
            'Authorization': auth})
        self.session.trust_env = False  # bypass the proxy

        self.log.debug("Authenticating as: %s" % user)
        self.log.debug("Using API Key: %s" % api_key)`enter code here`
        self.log.info("Connection to REST API successful")

    def url_for_resource(self, resource_name):
       return urljoin(self.url, resource_name) + "/"

    def create(self, resource_name, data):
        response = self.session.post(self.url_for_resource(resource_name),
                                 json.dumps(data), timeout=TIMEOUT)
        return self.handle_response(response)

    def handle_response(self, response):
        if (400 <= response.status_code <= 500):
            print('mars')
@mock.patch("requests.Session")
def BMRAPI(Session):
    api = BMRAPI('http://1.2.3.4/', 'dummy_user', '12345')
    data = {'hello': 123}
    api.create('testresource', data)

共有1个答案

敖子安
2023-03-14

这不完全是一个修复,更多的是一个变通方法。

不要进行<=比较,而是编写一个单独的方法:

def is_4xx_or_5xx_code(status_code):
    return 400 <= status_code <= 500

if is_4xx_or_5xx_code(status_code=response.status_code):
    print('works')

然后在你的测试中模仿它。

@mock.patch('path.to_code.under_test.is_4xx_or_5xx_code')
def test_your_method(mock_status_code):
    mock_status_code.return_value = True
    # rest of the test.
 类似资料:
  • 我有一个sql select查询,它只从数据库中检索单个列(组)(即),我在对象数组列表中接收上面列表的结果 , 理想情况下,结果应该包含一个对象数组列表,但是当我检查时,结果的第0个索引包含String object而不是object数组。 但是,如果我使用多个列(假设在查询的select子句中有2个列),我可以看到结果的第0个索引作为对象数组,即 即使查询的select子句中只提到一列,如何获

  • 我刚刚开始学习获取API:https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch 下面是我编写的一段代码片段,用于修补: 我希望从响应中得到一个JSON对象。json()。 与使用JSON时得到的类似。parse()。 相反,我得到了一个promise对象。 如果我像这里所示的那样扩大promise链... ..

  • 我正在使用dropwizard和jersey2 rest客户端,我得到 然而,当我打开日志记录时,我看到 我怎样才能反序列化这个响应,而不是只得到400? 我的代码看起来像 亚洲账户基本上是空的 我添加了apiVerson,时间戳和错误到亚洲帐户,但它仍然不工作。任何帮助都很感激。

  • 问题内容: 我在Spring Boot中有一个示例RestController: 我正在使用JSON库 当我点击API时,我得到一个异常提示: 路径为[]的Servlet [dispatcherServlet]的Servlet.service()抛出异常[请求处理失败;嵌套异常为java.lang.IllegalArgumentException:未找到类型为org.json.JSONObject

  • 我在Spring Boot中有一个RestController示例: 我正在使用JSON库 当我点击API时,我得到一个异常: 路径为[]的上下文中servlet[dispatcherServlet]的servlet.service()引发异常[请求处理失败;嵌套异常为java.lang.IllegalArgumentException:没有找到具有根本原因的返回值:class org.json.

  • 我正在处理jBPM 7.22.0。最终的 我使用服务任务REST从这个api获取响应https://reqres.in/api/users/1 我想将此响应获取到一个对象中,因此我创建了这个类(或jBPM中调用的数据对象): 我在jBPM中创建了一个名为res的全局变量,该变量具有我要存储响应的数据对象的类型。因此,在我的REST服务任务的“任务”中,我有屏幕截图中的内容。 如您所见,我想将结果存