【问题标题】:flask - unit testing session with nose烧瓶 - 带有鼻子的单元测试会话
【发布时间】:2018-11-24 18:45:08
【问题描述】:

我正在尝试用鼻子测试以下代码。 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 文件中的 print 语句不会打印任何内容。这是否意味着索引函数没有运行?

为什么会这样?根据烧瓶文档(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 有什么区别?据我了解,两者的重点是让请求上下文保持更长时间。

【问题讨论】:

    标签: python python-3.x flask nose


    【解决方案1】:

    您只是在设置请求上下文。您实际上需要让您的应用发送请求以使任何事情发生 - 类似于您的完整客户端中的 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() 有什么意义?它们是可以互换的,还是有一个不能使用另一个的用途?
    • 取决于您的需求。 test_client() 负责为您设置 request_context 并具有其他功能(例如,cookie jar、多个请求)。通常,如果您想测试烧瓶将发送回客户的内容,您会使用它。如果您只对测试路由部分感兴趣——正在选择正确的方法,正在正确解析参数——或者如果您需要更好地控制请求上下文,那么使用 test_request_context() 可能是有意义的。您在这个问题中的测试可能更适合 test_client()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 2021-09-07
    • 2015-03-15
    • 2017-12-07
    • 2018-11-09
    • 1970-01-01
    相关资源
    最近更新 更多