Модульные тесты генерируют «RuntimeError: Работа вне контекста приложения». с Mock 4.0.0 - PullRequest
1 голос
/ 26 мая 2020

После обновления Mock 3.0.5 до 4.0.0 мои модульные тесты не проходят. Я предполагаю, что patch больше не работает с flask.g, но я не смог найти обходной путь.

from mock import patch

import flask


def some_function():
    flask.g.somevariable = True
    return flask.g.somevariable


@patch('flask.g')
def test_some_function(mock_flask_global):
    assert some_function()

Вывод:

name = 'g'

    def _lookup_app_object(name):
        top = _app_ctx_stack.top
        if top is None:
>           raise RuntimeError(_app_ctx_err_msg)
E           RuntimeError: Working outside of application context.
E           
E           This typically means that you attempted to use functionality that needed
E           to interface with the current application object in some way. To solve
E           this, set up an application context with app.app_context().  See the
E           documentation for more information.

venv/lib/python3.6/site-packages/flask/globals.py:45: RuntimeError
========================================================================================================== short test summary info ===========================================================================================================
FAILED temp_test.py::test_some_function - RuntimeError: Working outside of application context.

Это сработало правильно в макете 3.0.5

1 Ответ

1 голос
/ 06 июня 2020

Ни разработчики python, ни разработчики flask не берут на себя ответственность за то, что это ошибка. Начиная с python 3.8 с unittest.mock и с макетной версией 4.0.0 (они одинаковы), он сначала проверяет, существует ли атрибут, который вы исправляете. Он должен возвращать атрибут или вызывать AttributeError. Flask вызывает RuntimeError, тем самым нарушая ожидаемый c logi. Кстати, разработчики Flask предложили вообще не исправлять flask .g, поскольку это всего лишь прокси для flask .globals.

В конечном итоге я сохранял соединение с БД в flask. g.db и хотел исправить это. Мое решение состояло в том, чтобы передать соединение с базой данных в ресурс при создании и не использовать flask .g вне моих вызовов before_request и teardown_request. В некоторых случаях, когда мне нужно исправить это, мне просто нужна правильная настройка контекста приложения.

...