[issue40805] Can no longer patch flask.g
New submission from Rob Taft : Whenever I try to patch flask.g, it appears to do nothing. This happened when I upgraded mock from 3.x to 4.x. I reported it on the mock github page https://github.com/testing-cabal/mock/issues/490 and was asked to report it here. The folllowing code run with pytest works fine in mock 3.0.5, but fails to patch in 4.0.0 and up. 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() -- components: Tests messages: 370197 nosy: Rob Taft priority: normal severity: normal status: open title: Can no longer patch flask.g type: behavior versions: Python 3.6, Python 3.8 ___ Python tracker <https://bugs.python.org/issue40805> ___ ___ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue40805] Can no longer patch flask.g
Rob Taft added the comment: The test was supposed to patch the flask component during the unit test, the error indicates the patch did not work. The actual error message is not relevant to the actual issue. I don't know why I was directed to here. When I replace it with unittest.mock, it appears to work fine, so my solution might end up being to dump the 3rd party mock library. On Fri, May 29, 2020 at 11:02 PM Terry J. Reedy wrote: > > Terry J. Reedy added the comment: > > Sorry, but I believe you were misdirected*. mock, as opposed to > unittest.mock, pytest, flask, and werkzeug are 3rd party modules. The > error report seems to be missing part of the stacktrace at both ends. What > line is your file resulted in the error? (This time we can guess == > @patch. @What called _lookup_app_object in flask? (I have no idea.) > > However, once contextlib._GeneratorContextManager calls next(self.gen), > the rest of the trace is outside the stdlib. At the end, the RuntimeError > is raised by flask, not by python, because the flask _app_ctx_stack.top > does not exist. If you do not understand their error message, ask flask > people. > > * I assume that cjw296 *glanced* at your report, saw 'RuntimeError', and > too quickly assumed 'cpython error'. flask could have defined, for > instance, FlaskRuntimeError for its error reporting. > > -- > nosy: +terry.reedy > resolution: -> third party > stage: -> resolved > status: open -> closed > > ___ > Python tracker > <https://bugs.python.org/issue40805> > ___ > -- ___ Python tracker <https://bugs.python.org/issue40805> ___ ___ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue40805] Can no longer patch flask.g
Rob Taft added the comment: I have confirmed that using unittest.mock instead of the 3rd party mock library in python 3.8.3 and 3.9-dev fails to patch flask.g. 3.7.7 works correctly. -- ___ Python tracker <https://bugs.python.org/issue40805> ___ ___ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue40805] Can no longer patch flask.g
Change by Rob Taft : -- versions: +Python 3.9 -Python 3.6 ___ Python tracker <https://bugs.python.org/issue40805> ___ ___ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue40805] Can no longer patch flask.g
Rob Taft added the comment: I updated the test with 2 cases and the traceback is different for each when I expected them to be the same if this was purely a mock issue, the line throwing the error is the same. I can post this over with flask and see what they think. from unittest.mock import patch import flask def some_function(): flask.g.somevariable = True return flask.g.somevariable @patch('flask.g') def test_patch(mock_flask_global): assert some_function() def test_no_patch(): assert some_function() $ pytest -vv temp_test.py test session starts = platform linux -- Python 3.8.3, pytest-5.4.3, py-1.8.1, pluggy-0.13.1 -- collected 2 items temp_test.py::test_patch FAILED [ 50%] temp_test.py::test_no_patch FAILED [100%] == FAILURES == _ test_patch _ args = (), keywargs = {} @wraps(func) def patched(*args, **keywargs): > with self.decoration_helper(patched, args, keywargs) as (newargs, newkeywargs): ../../../.pyenv/versions/3.8.3/lib/python3.8/unittest/mock.py:1322: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../../../.pyenv/versions/3.8.3/lib/python3.8/contextlib.py:113: in __enter__ return next(self.gen) ../../../.pyenv/versions/3.8.3/lib/python3.8/unittest/mock.py:1304: in decoration_helper arg = exit_stack.enter_context(patching) ../../../.pyenv/versions/3.8.3/lib/python3.8/contextlib.py:425: in enter_context result = _cm_type.__enter__(cm) ../../../.pyenv/versions/3.8.3/lib/python3.8/unittest/mock.py:1416: in __enter__ if spec is None and _is_async_obj(original): ../../../.pyenv/versions/3.8.3/lib/python3.8/unittest/mock.py:51: in _is_async_obj if hasattr(obj, '__func__'): pyvenv/lib/python3.8/site-packages/werkzeug/local.py:347: in __getattr__ return getattr(self._get_current_object(), name) pyvenv/lib/python3.8/site-packages/werkzeug/local.py:306: in _get_current_object return self.__local() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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. pyvenv/lib/python3.8/site-packages/flask/globals.py:45: RuntimeError ___ test_no_patch def test_no_patch(): > assert some_function() temp_test.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ temp_test.py:6: in some_function flask.g.somevariable = True pyvenv/lib/python3.8/
[issue40805] Can no longer patch flask.g
Rob Taft added the comment: https://github.com/pallets/flask/issues/3637 I've worked around the issue and accept that this will not work in the future. -- status: open -> closed ___ Python tracker <https://bugs.python.org/issue40805> ___ ___ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com