Могу ли я использовать макеты при тестировании функций приложения Flask? - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь протестировать некоторые маршруты в моем приложении Flask, которые вызывают внешние API, которые я хочу смоделировать.

Маршруты настроены так:

@app.route('/url/<string::arg>')
def route_function(arg):
    data = external_api(arg)
    response = make_response(data)
    # configure response
    return response

Я изначально пробовал что-то вроде этого:

class TestFlaskApp(unittest.TestCase):
    def setUp(self):
        self.app = app.test_client()

    @patch('external_api',
           side_effect=mock_api)
    def test_flask_route(self, api):
        result = app.get('/url/arg')
        self.assertEqual(result.status_code, 200)
        api.assert_called_once_with('arg')

..., что не удалось.Функция фиктивного API не была вызвана, так как я предполагаю, что имитация не применяется в контексте приложения.

Я также попробовал это, подумав, что я мог бы напрямую протестировать функции маршрута и, таким образом, избежать необходимости использоватьконтекст приложения:

class TestAppFunctions(unittest.TestCase):
    @patch('external_api',
           side_effect=mock_api)
    def test_flask_function(self, api):
        result = my_flask_app.route_function('arg')
        self.assertEqual(result.status_code, 200)
        api.assert_called_once_with('arg')

... но это тоже не сработало, поскольку для ответа route_function нужен контекст приложения.

Так что есть способиздеваться в контексте приложения?Как еще я могу проверить эти маршруты, не вызывая внешние вызовы API?

1 Ответ

0 голосов
/ 18 августа 2018

Oluwafemi Sule был прав ... Мне просто нужно было исправить функцию там, где она была использована, а не там, где она была определена.

Вам нужно передать путь к объектук функции патча, чтобы он мог быть решен и заменен на макет во время выполнения.Например, если external_api function вызывается в модуле с именем routes, который, в свою очередь, содержится в пакете с именем my_shining_app, патч будет передан как my_shining_app.routes.external_api

. Обратите внимание, что путь должен быть там, гдефункция вызывается (т. е. там, где ее нужно заменить на макет), а не там, где она определена

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