【问题标题】:How to require same file in Mocha test如何在 Mocha 测试中要求相同的文件
【发布时间】:2014-04-09 23:30:42
【问题描述】:

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

这是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;

【问题讨论】:

    标签: javascript node.js mocha.js chai


    【解决方案1】:

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

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

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

    顺便说一句,如果你的测试要变成异步的,你需要像现在一样的done 回调。如果您的测试打算像现在一样保持同步,您可以从提供给it 的回调的参数列表中删除done 并省略调用它。

    【讨论】:

    • require.resolve 为您提供文件的路径。在按路径删除缓存之前,您仍然需要 require(resolved) 。我建议为未来的读者添加它。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2018-11-13
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多