R. *_*Jin 5 python unit-testing fixtures pytest flask
我正在尝试使用 pytest 和应用程序工厂对应用程序进行单元测试,但我似乎无法在我的测试中访问客户端会话对象。我确定有一些我不会在某处推动的上下文。我在我的“应用程序”装置中推送应用程序上下文。我应该将请求上下文推送到某个地方吗?
下面是一个 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()
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
请注意,直接运行它可以正常工作,我可以跳过 /set、/check、/clear 并且它的行为符合预期。同样,仅使用测试客户端来获取页面的测试按预期工作。然而,直接访问会话似乎没有。
查看cookiecutter-flask 中的conftest.py中的以下内容。它可能会给你一些想法。
@pytest.yield_fixture(scope='function')
def app():
"""An application for the tests."""
_app = create_app(TestConfig)
ctx = _app.test_request_context()
ctx.push()
yield _app
ctx.pop()
@pytest.fixture(scope='function')
def testapp(app):
"""A Webtest app."""
return TestApp(app)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6295 次 |
| 最近记录: |