No se pueden configurar las variables de sesión en la prueba unitaria de matraz

Estoy teniendo dificultades para configurar las variables de la sesión de prueba para la prueba unitaria de algunas vistas del Frasco. Hay variables de sesión de “correo electrónico” y “nombre para mostrar” que normalmente se configuran a través del código que maneja las cosas de inicio de sesión de Google Oauth2. Mi objective es dejar que las herramientas de prueba de unidad establezcan esas variables de sesión en su lugar. De esa manera, mis puntos finales Flask se pueden probar independientemente de todo el negocio oauth2.

Esto es lo que he intentado hasta ahora. Escribí un mini-proyecto “incrementador de números” para aislar el problema. Aquí está el seguimiento de la stack de ejecutar la prueba de la unidad.

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' 

Aquí está la vista de mi aplicación de matraz de “mini proyecto” de incremento de número.

 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) 

Por último, aquí está la prueba de la unidad que me está haciendo difícil.

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

¿Alguien tiene alguna idea sobre cómo configurar correctamente las “variables de sesión simuladas” para este tipo de pruebas unitarias?

La sangría está mal. La sesión debe modificarse en el bloque session_transaction() , pero la solicitud debe enviarse después de que ese bloque haya finalizado. Unindent res = client.get() por un nivel.

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