tengo el siguiente código en un archivo que estoy tratando de probar:
foo.js
let localEnv = (process.env.LOCAL_ENVIRONMENT).toLowerCase() === 'prod' ? 'prod' : 'stage'; actualmente, configuro este valor usando setupFiles que apunta a env.js y contiene:
process.env.LOCAL_ENVIRONMENT = 'prod'; mi pregunta es, ¿cómo cambio process.env.LOCAL_ENVIRONMENT para test (o cualquier otra cosa) en foo.test.js ? Solo necesito hacer esto en una sola prueba, por lo que esta línea se cubrirá en mi cobertura de prueba.
Intenté hacer algo como esto pero no funcionó...
foo.prueba.js
test('Nonprod', async () => { process.env.LOCAL_ENVIRONMENT = 'test'; ... });Puede modificar el valor como lo intentó. Sin embargo, debe tener en cuenta que en su archivo original solo accede a la variable cuando carga este script por primera vez. Para que esto funcione tienes que hacer algo como esto:
// in your test file foo.test.js const prev = process.env.LOCAL_ENVIRONMENT process.env.LOCAL_ENVIRONMENT = 'test'; // from now on the env var is test const myModule = require('./foo.js'); // foo.js is executed and the var is read as test process.env.LOCAL_ENVIRONMENT = prev; // change value backEsto tiene algunos inconvenientes, ya que no puede probar múltiples escenarios con esto (ya que el módulo solo se carga una vez).
Si quieres probar más escenarios tienes múltiples opciones:
Una sería separar la lógica y el proceso.env.LOCAL_ENVIRONMENT, por ejemplo
function getLocalEnv(env = process.env.LOCAL_ENVIRONMENT) { return env.toLowerCase() === 'prod' ? 'prod' : 'stage'; }Esta función ahora es muy fácil de probar y ya no depende de env vars para eso.
Encontré la respuesta sobre cómo restablecer y volver a requerir el módulo probado aquí: cómo restablecer el módulo importado entre pruebas
La forma más fácil de probarlo para un caso de prueba específico es configurar la prueba en un ámbito de descripción y aplicar/eliminar el valor env en beforeAll/afterAll o beforeEach/afterEach ganchos según sus necesidades.
describe('Test example', () => { describe('prod (default)', () => { test('do the thing', () => { doTheThing(); // process.env.LOCAL_ENVIRONMENT is by default 'prod' because of your setupFiles }); }); describe('test env', () => { const oldEnv = process.env.LOCAL_ENVIRONMENT; // or { ...process.env } to copy the whole env beforeAll(() => { process.env.LOCAL_ENVIRONMENT = 'test'; }); afterAll(() => { process.env.LOCAL_ENVIRONMENT = oldEnv; // do not forget to do this }); test('do the thing', () => { doTheThing(); // process.env.LOCAL_ENVIRONMENT is 'test' here }); }); });