Estoy adaptando Jest a un JS antiguo que consta de varios archivos js y se crea mediante concatenación (y se supone que debe ejecutarse en el navegador). Algunos archivos usan "globales" definidos en otros. Para que Jest funcione, probé el paquete Rewire y lo hice funcionar para un caso sin dependencia como este:
// experiment.js function sum(a, b) { return a + b } const myVar = 'some' // experiment.test.js const rewire = require('rewire') const experimentRewired = rewire('./experiment.js') const $sum = experimentRewired.__get__('sum') const $myVar = experimentRewired.__get__('myVar') test('sum gives 1 + 2 = 3', () => { expect($sum(1, 2)).toBe(3) }) // not a real test, just shows that variables are loaded too test('myVar is equal to string "some"', () => { expect($myVar).toBe("some") })Este es un caso simple cuando todo lo que se va a probar está dentro de un solo archivo. Lo que estoy tratando de probar ahora es esencialmente inyectar una dependencia de otro archivo:
// globals.js – config should be injected into experiment.js const config = {} // experiment.js config.name = 'value' // experiment.test.js const rewire = require('rewire') const globalsRewired = rewire('./globals.js') const experimentRewired = rewire('./experiment.js') const $config = globalsRewired.__get__('config') experimentRewired.__set__('config', $config) // trying to inject const $$config = experimentRewired.__get__('config') test('config has .name', () => { expect($$config.name).toBeTruthy() }) pero esto da como resultado ReferenceError: config is not defined . Supongo que lo que sucede es que experiment.js se llama primero y la "inyección" ocurriría después (si no fuera el error anterior).
¿Hay alguna manera de "inyectar" la dependencia o puede concatenar virtualmente los archivos sin guardar un nuevo archivo js (que será el último recurso y no es deseable debido a consideraciones de rendimiento)? Se aceptan sugerencias con y sin Rewire.