Quiero configurar NODE_ENV en una de las pruebas unitarias, pero siempre está configurado para probar, por lo que mis pruebas fallan.
loggingService.ts
... const getTransport = () => { if (process.env.NODE_ENV !== "production") { let console = new transports.Console({ format: format.combine(format.timestamp(), format.simple()), }); return console; } const file = new transports.File({ filename: "logFile.log", format: format.combine(format.timestamp(), format.json()), }); return file; }; logger.add(getTransport()); const log = (level: string, message: string) => { logger.log(level, message); }; export default log;loggingService.spec.ts
... describe("production", () => { beforeEach(() => { process.env = { ...originalEnv, NODE_ENV: "production", }; console.log("test", process.env.NODE_ENV); log(loglevel.INFO, "This is a test"); }); afterEach(() => { process.env = originalEnv; }); it("should call log method", () => { expect(winston.createLogger().log).toHaveBeenCalled(); }); it("should not log to the console in production", () => { expect(winston.transports.Console).not.toBeCalled(); }); it("should add file transport in production", () => { expect(winston.transports.File).toBeCalledTimes(1); }); }); ...¿Cómo puedo establecer process.env.NODE_ENV en producción en mis pruebas, preferiblemente en beforeEach, de modo que el bloque if en mi servicio sea falso y se devuelva el transporte de archivos? He omitido parte del código en aras de la brevedad.
El problema central al que se enfrenta se debe al hecho de que una vez que intenta importar el archivo que está tratando de probar en su conjunto de pruebas, el código que contiene se evaluará de inmediato y se ejecutarán las funciones implícitamente invocadas, lo que significa que el logger.add(getTransport()); se llamará antes de que cualquiera de las funciones como beforeEach tenga la oportunidad de establecer las variables de entorno.
La única forma de evitar esto es utilizar el siguiente enfoque:
Primero deberá asignar la variable de entorno process.env.NODE_ENV a una variable const dentro de otro archivo. Llamémoslo environmentVariables.ts , y su contenido será el siguiente:
export const ENVIRONMENT = process.env.NODE_ENV; Entonces tendremos que refactorizar getTransport para usar esta variable de la siguiente manera:
const getTransport = () => { if (ENVIRONMENT !== "production") { En su conjunto de pruebas, tendrá que simular el archivo const que le permitirá cambiar la configuración de la variable ENVIRONMENT . Nota ../src/environmentVariables es un directorio de ejemplo y tendrá que definir realmente cuál es el directorio relevante de este archivo. Además, asegúrese de que esto esté fuera de la cláusula de describe , preferiblemente arriba para facilitar la lectura:
jest.mock('../src/environmentVariables', () => ({ ENVIRONMENT: 'production', })); Sus pruebas unitarias se ejecutarán con el ENVIRONMENT siendo production .