Como requerir el mismo archivo en la prueba Mocha

Tengo config/index.js que devuelve un archivo de configuración diferente basado en la variable de entorno NODE_ENV establecida.

Estoy tratando de escribir una prueba simple para garantizar que se devuelva la configuración correcta para cada entorno, pero me estoy topando con un problema en el que solo se llama al primer requisito y los requisitos posteriores del mismo archivo usan el valor de los primeros requieren.

¿Cómo debo cambiar mi prueba para resolver este problema?

 describe('config', function () { it('should return dev config', function (done) { process.env.NODE_ENV = 'development'; var config = require(__dirname + '/../../config'); // development config console.log(config.plugins.ipFilter); done(); }); it('should return prod config', function (done) { process.env.NODE_ENV = 'production'; // development config from above. // the require here doesn't actually get invoked var config = require(__dirname + '/../../config'); console.log(config.plugins.ipFilter); done(); }); }); 

Y aquí hay una versión simplificada de config/index.js (que funciona bien), que estoy tratando de probar:

 var Hoek = require('hoek'); var settings = { 'defaults': require('./settings/defaults'), 'production': require('./settings/production') }; var env; switch (process.env.NODE_ENV) { case 'production': env = 'production'; break; case 'development': env = 'development'; break; default: env = 'defaults'; break; } var config = Hoek.applyToDefaults(settings['defaults'], settings[env]); module.exports = config; 

Eliminaré el módulo de la memoria caché del módulo de Node antes de ejecutar la segunda prueba:

 var resolved = require.resolve(__dirname + '/../../config'); delete require.cache[resolved]; 

Así que cuando lo requiera de nuevo, Node se cargará desde cero. Tenga en cuenta que el código anterior solo eliminará el módulo de config de la memoria caché. Si necesita eliminar los módulos cargados por las llamadas require dentro de su módulo de config , entonces deberá hacer lo mismo que arriba para cada uno de ellos también.

Por cierto, si sus pruebas se vuelven asíncronas, necesita la callback done como la que tiene actualmente. Si se pretende que sus pruebas permanezcan sincrónicas como lo son ahora, podría eliminar el done de la lista de argumentos de las devoluciones de llamada que le it y omitirla.