Я пытаюсь проверить следующий код с носом. Файл app.py выглядит так:
from flask import Flask, session, redirect, url_for, request
app = Flask(__name__)
@app.route('/')
def index():
session['key'] = 'value'
print('>>>> session:', session)
return redirect(url_for("game"))
Тестовый файл находится ниже:
from nose.tools import *
from flask import session
from app import app
app.config['TESTING'] = True
web = app.test_client()
def test_index():
with app.test_request_context('/'):
print('>>>>test session:', session)
assert_equal(session.get('key'), 'value')
Когда я запускаю тестовый файл, я получаю ошибку утверждения None != 'value'
а оператор print в тестовом файле печатает пустой объект сеанса. Более того, выражение печати в файле app.py ничего не печатает. Означает ли это, что функция индекса не работает?
Почему это происходит? Согласно документации на фляге (http://flask.pocoo.org/docs/1.0/testing/#other-testing-tricks), я должен иметь доступ к содержимому сеанса через test_request_context().
Кроме того, если я пишу функцию test_index, как это, вместо этого, работает тест (и выполняются оба оператора print в файлах app.py и test):
def test_index():
with app.test_client() as c:
rv = c.get('/')
print('>>>>test session:', session)
assert_equal(session.get('key'), 'value')
В чем разница между использованием Flask.test_client() и Flask.test_request_context в выражении 'with'? Насколько я понимаю, суть в том, чтобы поддерживать контекст запроса дольше.
Вы настраиваете свой контекст запроса. Вам действительно нужно, чтобы ваше приложение отправило запрос на то, чтобы что-нибудь happen-- было похоже на ваш c.get() в вашем полном клиенте.
Попробуй попробовать, и я думаю, тебе повезет больше:
def test_index():
with app.test_request_context('/'):
app.dispatch_request()
print('>>>>test session:', session)
assert_equal(session.get('key'), 'value')
Flask.test_client()
иFlask.test_request_context()
? Являются ли они взаимозаменяемыми или есть использование для одного, где другой не может быть использован?