Quiero probar la unidad siguiente función:
from flask import current_app def fuu(): current_app.logger.info('hello world') any = current_app.config['any']Sin ningún manejo de contexto especial, recibo el siguiente mensaje de error:
E This typically means that you attempted to use functionality that needed E to interface with the current application object in some way. To solve E this, set up an application context with app.app_context(). See the E documentation for more information.Después de leer sobre el contexto de Flask, se me ocurrió una solución funcional :
@classmethod def setUpClass(cls): app = app_factory.create_app() ctx = app.app_context() ctx.push() cls.app = app Pero el punto es que no quiero tratar con ningún contexto de matraz en las pruebas UNIT . Quiero tener una prueba de unidad simple, en la que se pueda simular a todos los colaboradores, de modo que el sistema bajo prueba solo trate con la instancia simulada, en este caso también para current_app . Tener un contexto de matraz está bastante bien para las pruebas de integración, pero no para las pruebas unitarias.
Estoy buscando algo similar como esto:
@patch('flask.current_app')¿Hay alguna manera de lograr esto?
EDITAR #1
@GabrielC
servicio.py
from flask import current_app def fuu(): current_app.logger.info('hello world')test_servicio.py
import unittest from unittest.mock import patch class TestService(unittest.TestCase): @patch('flask.current_app') def test_generate_image_happy_path(self, mock): from service import fuu fuu() assert 1 == 1Esto falla por la misma razón exacta:
E RuntimeError: Working outside of application context.Editar: corregir el parche cuando se usa from flask import current_app
servicio.py
from flask import current_app def fuu(): current_app.logger.info('hello world')test_servicio.py
import unittest from unittest.mock import patch class TestService(unittest.TestCase): @patch('service.current_app') def test_generate_image_happy_path(self, mock): from service import fuu fuu() assert 1 == 1Respondiendo por cualquiera que se encuentre con el mismo problema. Lo que puede hacer es crear una aplicación Flask ficticia y usar su contexto en su prueba. No es necesario parchear nada.
import unittest from service import fuu class TestService(unittest.TestCase): app = Flask('test') def test_generate_image_happy_path(self): with app.app_context(): fuu() assert 1 == 1 Por supuesto, si desea tener acceso a su configuración de Flask , tendrá que pasarla a esta aplicación ficticia.