如何在不请求的情况下测试 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/
最好的功能是支持正则表达式。
我有一个像这样的函数:
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/
最好的功能是支持正则表达式。