Как написать модульные тесты, используя MOCKS, которые тестируют конечную точку - PullRequest
0 голосов
/ 09 ноября 2019

Я написал конечную точку, которая вызывает API для получения времени суток для часового пояса, определенного пользователем. Теперь мне нужно смоделировать эту конечную точку, но у меня возникают проблемы с правильным ответом. Вот код, который я написал:

Я не совсем уверен, что я должен позвонить, чтобы получить ответ.


import requests
import json
import jsonpath
import dateutil
from flask import Flask, render_template, request
from flask import jsonify, make_response

app = Flask(__name__, template_folder="templates")


@app.route('/get_time', methods=['GET'])
def get_time():

    try:
        time_zone = request.args.get('time_zone')
        url = "http://worldclockapi.com/api/json/" + time_zone + "/now"
        r = requests.get(url)
    except Exception:
        return make_response(jsonify({"Error": "Some error message"}), 400)
    return r.json()["currentDateTime"]


    if response.status_code != 200:
        print("Error on response")
        return response.status_code, response.text

if __name__ == '__main__':
    app.run(debug=True)

Вот что у меня есть для теста:

import json
import unittest
import unittest.mock
import requests

#name of the file being tested
import timeofday


class MockResponse:

    def __init__(self, text, status_code):
        self.text = text
        self.status_code = status_code

    def json(self):
        return json.loads(self.text)

    def __iter__(self):
        return self

    def __next__(self):
        return self

#json returned by the API http://worldclockapi.com/api/json/est/now
def mock_requests_timeofday(*args, **kwargs):
    text = """
    {
        "$id": "1",
        "currentDateTime": "2019-11-08T15:52-05:00",
        "utcOffset": "-05:00:00",
        "isDayLightSavingsTime": false,
        "dayOfTheWeek": "Friday",
        "timeZoneName": "Eastern Standard Time",
        "currentFileTime": 132177019635463680,
        "ordinalDate": "2019-312",
        "serviceResponse": null
    }}
    """
    response = MockResponse(text, 200)
    return response


class TestLocation(unittest.TestCase):

    @unittest.mock.patch('requests.get', mock_requests_get_success)
    def test_get_time(self):

        self.assertEqual(response.status_code, 200)


class TestTimeofday(unittest.TestCase):
    @unittest.mock.patch('timeofday.requests.get', mock_requests_timeofday)
    def get_time(self):
        self.assertEqual(response.status_code, 200)

1 Ответ

1 голос
/ 09 ноября 2019

Ваш код в настоящее время терпит неудачу, потому что вы напрямую имитируете функцию get модуля, который вы импортировали в ваш тестовый файл.

Для того, чтобы ваш тест заработал, вам придется напрямую имитировать requests.get метод вашего другого файла.

Вот как может выглядеть макет метода get, который вы сделали в timeofday.py: mock.patch('timeofday.requests.get', mock_requests_get_success)

Теперь, когда вы выполняете get_timeВызов API должен быть поддельным, и вы получите определенный вами ответ.

PS: имейте в виду, что оператор if, который вы написали после возврата r.json () ["currentDateTime"], никогда не будет выполнен, потому что ваша функциязаканчивается, когда вы используете return.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...