gpt4 book ai didi

python - 使用应用程序工厂时在 pytest 测试中访问 Flask 测试客户端 session

转载 作者:太空宇宙 更新时间:2023-11-03 11:23:27 25 4
gpt4 key购买 nike

我正在尝试使用 pytest 和应用工厂对应用程序进行单元测试,但我似乎无法在我的测试中访问客户端 session 对象。我确定有一些背景我不会在某个地方插入。我将应用程序上下文推送到我的“应用程序” fixture 中。我应该将请求上下文推送到某处吗?

下面是一个MWE。

mwe.py:

from flask import Flask, session


def create_app():
app = Flask(__name__)
app.secret_key = 'top secret'

@app.route('/set')
def session_set():
session['key'] = 'value'
return 'Set'

@app.route('/check')
def session_check():
return str('key' in session)

@app.route('/clear')
def session_clear():
session.pop('key', None)
return 'Cleared'

return app


if __name__ == "__main__":
mwe = create_app()
mwe.run()

conftest.py:

import pytest
from mwe import create_app


@pytest.fixture(scope='session')
def app(request):
app = create_app()

ctx = app.app_context()
ctx.push()

def teardown():
ctx.pop()

request.addfinalizer(teardown)
return app


@pytest.fixture(scope='function')
def client(app):
return app.test_client()

test_session.py:

import pytest
from flask import session


def test_value_set_for_client_request(client): # PASS
client.get('/set')
r = client.get('/check')
assert 'True' in r.data


def test_value_set_in_session(client): # FAIL
client.get('/set')
assert 'key' in session


def test_value_set_in_session_transaction(client): # FAIL
with client.session_transaction() as sess:
client.get('/set')
assert 'key' in sess

请注意,直接运行它可以正常工作,我可以在/set、/check、/clear 之间跳转,它的行为符合预期。同样,仅使用测试客户端获取页面的测试按预期工作。然而,直接访问 session 似乎没有。

最佳答案

问题在于您使用测试客户端的方式。

首先,您不必创建客户端装置。如果你使用 pytest-flask,它会提供一个 client fixture 供你使用。如果您仍然想使用自己的客户端(可能是因为您不想要 pytest-flask),您的客户端 fixture 应该充当上下文处理器来包装您的请求。

所以你需要像下面这样的东西:

def test_value_set_in_session(client):
with client:
client.get('/set')
assert 'key' in session

当天的信息:pytest-flask 有一个与您的类似的客户端装置。不同之处在于 pytest-flask 使用上下文管理器为您提供客户端,并且每次测试为您节省 1 行

@pytest.yield_fixture
def client(app):
"""A Flask test client. An instance of :class:`flask.testing.TestClient`
by default.
"""
with app.test_client() as client:
yield client

你使用 pytest-flask client 进行测试

def test_value_set_in_session(client):
client.get('/set')
assert 'key' in session

关于python - 使用应用程序工厂时在 pytest 测试中访问 Flask 测试客户端 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38545913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com