如何在Flask应用程序工厂中测试非视图功能?

时间:2019-05-21 20:58:21

标签: flask pytest

我在Flask中使用工厂模式。这是我的代码的简化版本:

def create_app():
    app = Flask(__name__)

    @app.before_request
    def update_last_seen():
        if current_user.is_authenticated:
            current_user.update(last_seen=arrow.utcnow().datetime)

    @app.route('/', methods=['GET'])
    def home():
         return render_template("home.html")

    return app

我正在使用pytest-flask,并且希望能够为update_last_seen函数编写测试。

如何访问该功能?我无法在client.application(client是通过pytest-flask自动使用的灯具)中找到它,也无法在我通过app设置的conftest.py灯具中找到它,如下所示:< / p>

@pytest.fixture
def app():
    os.environ["FLASK_ENV"] = "test"
    os.environ["MONGO_DB"] = "test"
    os.environ["MONGO_URI"] = 'mongomock://localhost'

    app = create_app()
    app.config['ENV'] = 'test'
    app.config['DEBUG'] = True
    app.config['TESTING'] = True

    app.config['WTF_CSRF_ENABLED'] = False   

    return app

因此,当我运行此测试时:

def test_previous_visit_is_stored_in_session(app, client):
    app.update_last_seen()

我得到的错误是:

    def test_previous_visit_is_stored_in_session(app, client):
>       app.update_last_seen()
E       AttributeError: 'Flask' object has no attribute 'update_last_seen' 

我也一直在浏览app.before_request_funcs,但不幸的是没有结果。

1 个答案:

答案 0 :(得分:1)

参考the docs,您可以手动运行请求的预处理。

initial_last_seen = current_user.last_seen

with app.test_request_context('/'):
    app.preprocess_request()

    assert current_user.last_seen != initial_last_seen # ...for example