首页 > 解决方案 > Python 单元测试失败的请求

问题描述

我正在尝试测试一个应该失败但我想返回一个值的 http 调用。但是我所做的测试没有通过覆盖范围:

    def callAPI(self, tokenURL:str):
    requestBuilder: RequestBuilder = RequestBuilder()

    try:
        response = requestBuilder.get(tokenURL)
        return response.json()
        # return "content"
    except Exception as err:
        Logger.error("An error occured while trying to call API "+ err)
        return None

这是我的测试功能:

@responses.activate
def testCallDemFails():
  responses.add(
    responses.GET, 'http://calldem.com/api', json="{'err'}", status=500)

  with pytest.raises(Exception):
    demConfig = DemConfig()
    resp = demConfig.callAPI('http://callAPI.com/api/1/foobar')
    print("testCallAPIFail", resp)
    assert resp == None

requestBuilder.get 方法只返回一个 request.get 函数。当我执行该函数时,我什至没有 testAPI 失败。你有什么想法 ?

标签: pythonpytest

解决方案


看起来测试函数没有将您正在使用的请求 URL 连接到您期望的响应 URL。http://callAPI.com/api/1/foobar不匹配http://calldem.com/api,测试响应也没有配置为正则表达式匹配,这将启用示例代码所暗示的子路径匹配。我猜测错误配置的 URL 映射返回的响应是 JSON 可解析的(或无),因此永远不会引发异常。

如果您尝试以下测试代码,它是否有效?:

import re

@responses.activate
def testCallDemFails():
  responses.add(
    responses.GET, re.compile('http://callAPI.com/api/.*'), json="{'err'}", status=500)

  with pytest.raises(Exception):
    demConfig = DemConfig()
    resp = demConfig.callAPI('http://callAPI.com/api/1/foobar')
    print("testCallAPIFail", resp)
    assert resp == None

推荐阅读