2016-02-18 2 views
0

У меня возникают сложные временные параметры тестовых переменных сеанса для модульного тестирования некоторых видов фляг. Существуют переменные сеанса «email» и «display name», которые обычно устанавливаются с помощью кода, который обрабатывает элементы входа в Google Oauth2. Моя цель - позволить инструментальным средствам тестирования установить эти переменные сеанса. Таким образом, мои конечные точки Flask можно протестировать независимо от всего бизнеса oauth2.Не удается получить переменные сеанса в тестовом модуле

Вот что я пробовал до сих пор. Я написал отдельный мини-проект «incrementer number», чтобы изолировать проблему. Вот трассировка стека от запуска модульного теста.

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() 

Есть ли у кого-нибудь идеи по правильной настройке «moker session variables» надлежащим образом для этих типов модульных тестов?

+0

Я думаю, это потому, что он не имеет контекст запроса. Может помочь использовать 'с app.test_request_context():' [Docs] (http://flask.pocoo.org/docs/0.10/api/#flask.Flask.test_request_context) – adarsh

ответ

4

Оно должно быть:

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

Эй, это имеет смысл. Контекстные области должны храниться отдельно. Не имеет смысла тестировать запрос, если вы еще не знаете, что вы сделали настройку уровня сеанса. Спасибо, лорд63. J –

Смежные вопросы