колба - сессия юнит-тестирования с носом

1

Я пытаюсь проверить следующий код с носом. Файл 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'? Насколько я понимаю, суть в том, чтобы поддерживать контекст запроса дольше.

Теги:
python-3.x
flask
nose

1 ответ

1
Лучший ответ

Вы настраиваете свой контекст запроса. Вам действительно нужно, чтобы ваше приложение отправило запрос на то, чтобы что-нибудь happen-- было похоже на ваш c.get() в вашем полном клиенте.

Попробуй попробовать, и я думаю, тебе повезет больше:

def test_index():

    with app.test_request_context('/'):
        app.dispatch_request()
        print('>>>>test session:', session)
        assert_equal(session.get('key'), 'value')
  • 0
    Это действительно сработало, спасибо! Какой смысл иметь Flask.test_client() и Flask.test_request_context() ? Являются ли они взаимозаменяемыми или есть использование для одного, где другой не может быть использован?
  • 0
    Зависит от ваших потребностей. Test_client () заботится о настройке request_context для вас и имеет дополнительные функции (например, cookie jar, несколько запросов). В общем, если вы хотите проверить, какую флягу отправят обратно клиенту, вы должны пойти на это. Если вы заинтересованы в тестировании только части вещей о маршрутизации - выбирается правильный метод, параметры анализируются правильно - или если вам необходим более точный контроль над контекстом запроса, то может иметь смысл использовать test_request_context (). Ваш тест в этом вопросе, вероятно, лучше подойдет для test_client ().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню