Wie kann ich simulieren-Verbindung-Fehler-und request-timeouts in python unit-tests
Nehme mein django/flask Anwendung, zieht Informationen von API ' s, wie kann ich testen, dass mit Verbindungs exceptions werden abgefangen und behandelt, richtig?
So wird hier z.B. eine Funktion aufruft, die eine API:
import requests
def call_the_api():
url = 'http://httpbin.org/get'
try:
req = requests.get(url)
if req.json().get('errors'):
logger.warn("API error response")
return {'request_error': 'api_error_response'}
except requests.exceptions.ConnectionError:
logger.warn('ConnectionError')
return {'request_error': 'ConnectionTimeout'}
except requests.exception.Timeout:
logger.warn('API request timed out')
return {'request_error': 'Timeout'}
except Exception, ex:
logger.warn("API request Exception: %s", ex)
return {'request_error': ex}
else:
return req.json()
Zur Prüfung Antworten aus der API, die ich gefunden mock sehr nützlich zu sein.
def mock_get_request():
response = requests.get.return_value
json_file = 'sample_response.json'
json_file_path = os.path.join(os.path.dirname(__file__), json_file)
with open(json_file_path, 'r') as f:
response.content = response.text = f.read()
response.status_code = 200
response.encoding = 'utf-8'
response.json = lambda: json.loads(response.content.decode(response.encoding))
response.url = u'%s' % args[0]
return response
class TestSuitabilityFunctions(TestCase):
def test_call_the_api(self):
requests.get = MagicMock(side_effect=mock_get_request)
resp = call_the_api()
self.assertEqual(resp.get('url'), "http://httpbin.org/get")
Also meine Frage ist, wie würde ich mich über die Simulation eines Verbindungs-Timeouts oder Fehler?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ungetesteten code, aber...
... oder ähnliches sollten den trick tun. Aus der Spitze von meinem Kopf ich kann mich nicht erinnern, wie assertRaises interagiert mit Fehlern, die gefangen sind. Vielleicht brauchen Sie nicht einmal die assertRaises Teil.