如何在摩卡testing中要求相同的文件

我有config/index.js ,它根据设置的NODE_ENV环境variables返回一个不同的configuration文件。

我试图写一个简单的testing,以确保正确的configuration是为每个环境返回的,但我遇到了一个问题,其中只有第一个要求实际上是被调用,随后的要求相同的文件正在使用的值第一个要求。

我应该如何改变我的testing来解决这个问题?

 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(); }); }); 

这里是一个config/index.js (这工作正常)的简化版本,我试图testing:

 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; 

在运行第二个testing之前,我会从Node的模块caching中删除模块:

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

所以当再次需要时,Node将从头开始加载。 请注意,上面的代码只会从caching中删除config模块。 如果你需要删除你的config模块中的require调用加载的模块,那么你也必须像上面一样对每个模块执行相同的操作。

顺便说一句,如果你的testing将变得asynchronous,你需要像你现在donecallback。 如果您的testing目前仍然保持同步,那么您可以从您给it的callback的参数列表中删除it并省略调用它。