Javascript 如何在Mocha测试中要求相同的文件

Javascript 如何在Mocha测试中要求相同的文件,javascript,node.js,mocha.js,chai,Javascript,Node.js,Mocha.js,Chai,我有config/index.js,它根据设置的NODE_ENV环境变量返回不同的配置文件 我正试图编写一个简单的测试,以确保为每个环境返回正确的配置,但我遇到了一个问题,即实际上只调用了第一个require,同一文件的后续require使用了第一个require的值 我应该如何更改测试以解决此问题 describe('config', function () { it('should return dev config', function (done) { process.en

我有
config/index.js
,它根据设置的NODE_ENV环境变量返回不同的配置文件

我正试图编写一个简单的测试,以确保为每个环境返回正确的配置,但我遇到了一个问题,即实际上只调用了第一个require,同一文件的后续require使用了第一个require的值

我应该如何更改测试以解决此问题

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的简化版本(运行良好),我正在尝试测试:

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;

在运行第二个测试之前,我将从节点的模块缓存中删除模块:

var resolved = require.resolve(__dirname + '/../../config');
delete require.cache[resolved];
因此,当再次需要它时,节点将从头开始加载。请注意,上面的代码只会从缓存中删除
config
模块。如果您需要删除
require
调用在
config
模块中加载的模块,那么您也必须对每个模块执行上述操作


顺便说一下,如果您的测试将变得异步,那么您需要像当前一样的
done
回调。如果您的测试要像现在一样保持同步,则可以从您给
it
的回调参数列表中删除
done
,并忽略调用它。

require.resolve提供文件的路径。在按路径删除缓存之前,仍然需要(已解决)。我建议为未来的读者补充这一点。谢谢你的帮助。