flask - 带鼻子的单元测试会话

flask - unit testing session with nose

我正在尝试用 nose 测试以下代码。 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' 测试文件中的打印语句打印一个空的会话对象。此外,app.py 文件中的打印语句不打印任何内容。这是否意味着索引函数不是 运行ning?

为什么会这样?根据烧瓶文档(http://flask.pocoo.org/docs/1.0/testing/#other-testing-tricks), 我应该可以通过 test_request_context().

访问会话内容

此外,如果我改为这样编写 test_index 函数,则测试有效(并且执行 app.py 和测试文件中的两个打印语句):

def test_index():

    with app.test_client() as c:
        rv = c.get('/')
        print('>>>>test session:', session)
        assert_equal(session.get('key'), 'value')

在 'with' 语句中使用 Flask.test_client() 和 Flask.test_request_context 有什么区别?据我了解,两者的重点是让请求上下文保持更长时间。

您只是在设置您的请求上下文。您实际上需要让您的应用分派请求才能发生任何事情——类似于您在完整客户端中的 c.get()。

试试下面的方法,我想你会有更好的运气:

def test_index():

    with app.test_request_context('/'):
        app.dispatch_request()
        print('>>>>test session:', session)
        assert_equal(session.get('key'), 'value')