Estoy usando la gestión de configuración de Pydantic en un proyecto basado en FastAPI. Tengo una clase de Settings como esta:
class Settings(BaseSettings): FOO: str = '' BAR: int = 0 class Config: env_file = "path/to/.my_env_file") env_nested_delimiter = "__" La path/to/.my_env_file contiene valores FOO y BAR .
Durante las pruebas, necesito parchear selectivamente Settings y no quiero leer nada de path/to/.my_env_file . P.ej,
path/to/.my_env_file
FOO=i_do_not_wanna_read_this BAR=100mi archivo de prueba:
@lru_cache() def get_settings(): return Settings() def get_settings_override() -> Settings: return Settings( FOO = 'foo' ) app.dependency_overrides[get_settings] = get_settings_override Quiero ejecutar pruebas con FOO='foo' y con el valor predeterminado de BAR (es decir, BAR=0 , ignorando el contenido de path/to/.my_env_file . En el código anterior, obtengo FOO='foo' pero BAR todavía se lee desde path/to/.my_env_file (es decir, BAR=100 )
¿Hay una manera directa de manejar eso?
Si bien no pude encontrar una solución sencilla en los documentos o en cualquier otra página, esto funcionó para mis pruebas:
Cuando use tox, coloque esto en su tox.ini , según esta pregunta de desbordamiento de pila :
[testenv] setenv = TOX_TESTENV = true Luego puede simplemente usar el siguiente fragmento para anular la configuración de su env_file :
import os # ... snip ... if os.environ.get("TOX_TESTENV") is not None: Settings.Config.env_file = "" Enfoques similares, por ejemplo, al verificar sys.argv para verificar la existencia de "prueba" o verificar si unittest está cargado , también deberían funcionar bien:
import sys # ... snip ... if len(sys.argv) > 1 and "pytest" in sys.argv[0]: Settings.Config.env_file = ""