Python 单元测试生成;运行时错误:在应用程序上下文之外工作。”;使用Mock 4.0.0

Python 单元测试生成;运行时错误:在应用程序上下文之外工作。”;使用Mock 4.0.0,python,flask,mocking,Python,Flask,Mocking,从模拟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):

从模拟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中正常工作,python开发人员和flask开发人员都不认为这是一个bug。 从Python3.8的unittest.mock和mock版本4.0.0(它们是相同的)开始,它首先检查要修补的属性是否存在。它应该返回属性或引发AttributeError。Flask引发运行时错误,从而破坏预期逻辑。另一方面,Flask开发人员建议根本不要修补Flask.g,因为它只是Flask.globals的代理


最终,我将DB连接存储在flask.g.DB中,并希望对此进行修补。我的解决方案是在构造时将数据库连接传递到资源中,并且在before_请求和teardown_请求调用之外不使用flask.g。对于少数需要修补的情况,我只需要正确地设置应用程序上下文。

如果您使用的是Python 3.6+,为什么不使用unittest import mock中的
?谢谢,这似乎很有用work@MauroBaraldimock 4.0.2似乎只是unittest.mock python 3.8+的一个后端口。当我使用unittest.mock从Python3.8和3.9运行这个程序时,它也失败了。