guia español descargar python unit-testing testing mocking patch

python - descargar - qgis español



Cómo parchar una constante en python (1)

Tengo dos módulos diferentes en mi proyecto. Uno es un archivo de configuración que contiene

LOGGING_ACTIVATED = False

Esta constante se usa en el segundo módulo (llamémoslo main) como lo siguiente:

if LOGGING_ACTIVATED: amqp_connector = Connector()

En mi clase de prueba para el módulo principal me gustaría parchear esta constante con el valor

True

Desafortunadamente lo siguiente no funciona

@patch("config.LOGGING_ACTIVATED", True)

ni tampoco esto funciona:

@patch.object("config.LOGGING_ACTIVATED", True)

¿Alguien sabe cómo parchar una constante de diferentes módulos?


Si la prueba if LOGGING_ACTIVATED: ocurre en el nivel del módulo , debe asegurarse de que ese módulo aún no se haya importado primero. El código a nivel de módulo se ejecuta solo una vez (la primera vez que se importa el módulo en cualquier lugar), no puede probar el código que no se ejecutará nuevamente.

Si la prueba está en una función, tenga en cuenta que el nombre global utilizado es LOGGING_ACTIVATED , no config.LOGGING_ACTIVATED . Como tal, necesita parchear main.LOGGING_ACTIVATED aquí:

@patch("main.LOGGING_ACTIVATED", True)

ya que esa es la referencia real que quería reemplazar.

También vea la sección Dónde parchear de la documentación mock .

Debería considerar refactorizar el código a nivel de módulo para algo más comprobable. Aunque puede forzar una recarga del código del módulo eliminando el objeto del módulo de la asignación de sys.modules , es más sencillo mover el código que desea que sea verificable a una función.

Así que si tu código ahora se ve algo como esto:

if LOGGING_ACTIVATED: amqp_connector = Connector()

Considere usar una función en su lugar:

def main(): global amqp_connector if LOGGING_ACTIVATED: amqp_connector = Connector() main()

O producir un objeto con atributos incluso.