无法获取会话变量设置在Flask单元测试中

问题描述:

我在设置测试会话变量时很难设置单元测试某些Flask视图。有“电子邮件”和“显示名称”会话变量,通常通过代码处理谷歌Oauth2登录的东西设置。我的目标是让单元测试工具设置这些会话变量。这样,我的Flask终端可以独立于整个oauth2业务进行测试。无法获取会话变量设置在Flask单元测试中

这是我到目前为止尝试过的。我写了一个单独的“数字增值”微型项目来隔离这个问题。这是运行单元测试的堆栈跟踪。

Error 
Traceback (most recent call last): 
    File "/home/myusername/PycharmProjects/FlaskTestingStuff/MyFlaskTest.py", line 12, in testNumberIncrease 
    self.assertTrue(res is not None) 
    File "/usr/lib/python3.4/contextlib.py", line 66, in __exit__ 
    next(self.gen) 
    File "/usr/local/lib/python3.4/dist-packages/flask/testing.py", line 94, in session_transaction 
    self.cookie_jar.extract_wsgi(c.request.environ, headers) 
    File "/usr/local/lib/python3.4/dist-packages/flask/ctx.py", line 386, in __exit__ 
    self.auto_pop(exc_value) 
    File "/usr/local/lib/python3.4/dist-packages/flask/ctx.py", line 374, in auto_pop 
    self.pop(exc) 
    File "/usr/local/lib/python3.4/dist-packages/flask/ctx.py", line 341, in pop 
    self.app.do_teardown_request(exc) 
    File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1710, in do_teardown_request 
    bp = _request_ctx_stack.top.request.blueprint 
AttributeError: 'NoneType' object has no attribute 'request' 

这里是我的号码增加“迷你项目”烧瓶应用程序的视图。

from flask import Flask, session, request 

app = Flask(__name__) 
app.secret_key = "somedumbkey" 

@app.route("/increasenum", methods=["GET"]) 
def increase_num(): 
    if session and "last_num" in session: 
     num = session["last_num"] 
     num = str(int(num) + 1) 
     session["last_num"] = num 
     return num 
    else: 
     session["last_num"] = "0" 
     return "0" 

if __name__ == '__main__': 
    app.run(debug=True) 

最后,这是单元测试,给我一个很难。

import unittest 
from flaskapp import app 
from flask import session 

class FlaskTestCase(unittest.TestCase): 

    def testNumberIncrease(self): 
     with app.test_client() as client: 
      with client.session_transaction() as sess: 
       sess["last_num"] = "8" 
       res = client.get("/increasenum") 
       self.assertTrue(res is not None) 

if __name__ == '__main__': 
    unittest.main() 

有谁知道如何正确设置“模拟会话变量”适当为这些类型的单元测试什么想法?

+0

我想这是因为它不具有请求上下文。可以帮助使用'与app.test_request_context():'[文档](http://flask.pocoo.org/docs/0.10/api/#flask.Flask.test_request_context) – adarsh

它应该是:

import unittest 
from flaskapp import app 
from flask import session 

class FlaskTestCase(unittest.TestCase): 
    def testNumberIncrease(self): 
     with app.test_client() as client: 
      with client.session_transaction() as sess: 
       # Modify the session in this context block. 
       sess["last_num"] = "8" 
      # Test the request in this context block. 
      res = client.get("/increasenum") 
      self.assertTrue(res is not None) 

if __name__ == '__main__': 
    unittest.main() 
+0

嘿,这是有道理的。上下文范围必须保持分离。如果您还不知道您已完成会话级别设置,则测试请求没有意义。谢谢,主啊。 Ĵ –