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

dor*_*emi 1 javascript mocha.js node.js chai

我有config/index.js基于设置的NODE_ENV环境变量返回不同的配置文件.

我正在尝试编写一个简单的测试来确保为每个环境返回正确的配置,但我遇到的问题是,实际上只调用了第一个需要,并且后续需要同一个文件正在使用来自第一个要求.

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

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();
  });
});
Run Code Online (Sandbox Code Playgroud)

这是一个简化版本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;
Run Code Online (Sandbox Code Playgroud)

Lou*_*uis 6

在运行第二个测试之前,我会从Node的模块缓存中删除该模块:

var resolved = require.resolve(__dirname + '/../../config');
delete require.cache[resolved];
Run Code Online (Sandbox Code Playgroud)

因此,当再次需要它时,Node将从头开始加载.请注意,上面的代码只会config从缓存中删除模块.如果您需要删除由加载的模块require调用里面config模块,那么你就必须做到上面一样为他们每个人也.

顺便说一句,如果您的测试将变为异步,那么您需要done像现在这样的回调.如果您的测试要保持现在的同步,则可以done从您给出的回调的参数列表中删除it并省略调用它.