0

在我的 Node 应用程序中,有一个这样的配置文件:

module.exports = {
    BUILD_DIR: '/some.path',
    OTHER_CONFIG: 42,
    // ...
};

我也有一些测试做类似的事情

var appConfig = require('./path/to/appConfig');
appConfig.BUILD_DIR = 'tmp/some/path';
// and stuff done with appConfig

令我惊讶的是,这样做显然会修改模块的状态。我的下一个需要它的测试将BUILD_DIR设置为“tmp/some/path”。我没有意识到模块有这种跨需求的状态。如何在测试中消除这种影响?另外,我怎样才能防止人们修改这个模块的状态?如果有人包含它,他们应该总是得到它定义的东西,而不是一些其他代码写给它的东西。

4

2 回答 2

1

假设您的模块称为“配置”,并且您最初:

var Config=require('Config');

你可以:

delete require.cache[require.resolve('Config')];

这将从 require 的缓存中删除模块,从而在您下一次“要求”它时重新加载它。

要点:https ://gist.github.com/raisch/6786930

于 2013-10-01T23:38:18.273 回答
1

原因在这里解释

模块在第一次加载后被缓存。这意味着(除其他外)每次调用都require('foo') 将返回完全相同的对象,如果它会解析为同一个文件。

(强调我的)

因此,您正在导出的对象被缓存并在使用它的代码之间共享。

如果这不是您想要的,您可以导出一个函数:

module.exports = function() {
  return {
    BUILD_DIR: '/some.path',
    OTHER_CONFIG: 42,
    // ...
  };
};

require它就像这样:

var appConfig = require('./path/to/appConfig')();
于 2013-10-01T12:30:15.627 回答