如何在不请求的情况下测试 API 的结果

how to test the result of an API without requesting it

我有一个像这样的函数:

def request_API(request_url):  #To test
    fail_request = -1
    response = requests.get(request_url)
    if response.ok:
        infos = json.loads(response.text)
        if infos.has_key("movie"):
            return  infos["movie"]
        if infos.has_key("tvseries"):
            return  infos["tvseries"]

    print "Allocine API Request Error"
    return fail_request 

我做了这样的测试:

def test_should_fail_to_request(self):
        #GIVEN
        response = json.dumps({"error":{"code":0,"$":"No result"}})
        requests.get = mock.MagicMock(return_value=response)

        #WHEN
        response = my_mod.request_allocine_API("") #requests mocked so we don't need an URL

        #THEN
        self.assertEqual(response, -1, "There should be an error in the API")

但是我有一个错误:

AttributeError: 'str' object has no attribute 'ok'

我知道这是因为当我嘲笑 request.get 我 return 一个 JSON。我的问题是正确的方法是什么。我是否要重新创建一个对象请求,或者是否有更简单的方法来这样做。

您正在模拟 requests.get,它通常 return 是一个 Response 对象,而不是 return 一个纯字符串。尝试用 return 一个 Response 对象代替:

from mock import patch
from requests import Response


def test_should_fail_to_request(self):
    mock_response = Response()
    mock_response.status_code = 404
    mock_response.body = json.dumps({"error":{"code":0,"$":"No result"}})

    with patch('requests.get', return_value=mock_response):
        response = my_mod.request_allocine_API("")

    self.assertEqual(response, -1, "There should be an error in the API")

我使用 requests-mock 库,效果很好。

文档位于:https://requests-mock.readthedocs.org/en/latest/

最好的功能是支持正则表达式。