两次导入或需要 javascript 文件以进行 mocha 测试

Importing or requiring a javascript file twice for mocha testing

我正在编写一个规范,以根据 global.window 的存在来测试 javascript 文件中的差异。有什么方法可以两次导入或要求特定文件吗?设置 global.window.

之前和之后各一次

正在测试的文件看起来像这样:

let someObject = (windowExists => {
  return windowExists ? 'abc' : '123';
})(typeof window !== 'undefined');

export default someObject;

我希望使用这种模式,但它似乎不可行,因为 common.js 和 es6 模块都只包含一次文件,然后处理缓存版本。

您可以使用 vm.runInContext() 函数针对给定的、可能孤立的上下文执行任意 JavaScript(作为字符串)。在这种情况下,您可以将 window 的值设置为 undefined 或任何其他适合您需要的值。

使用vm模块实际上有更多方法可以达到同样的效果,但总的原则仍然是:

  1. 将 JavaScript 待测代码作为字符串加载
  2. 创建一个 pre-determined 您希望脚本在其中执行的全局状态
  3. 执行脚本
  4. 观察结果

这比大多数人意识到的要容易。所有需要的模块都存储在 require.cache 上。您可以简单地从缓存中删除模块,然后要求它不再从缓存中拉取模块。缓存模块的关键是模块的完整路径,如果你不想输入完整路径,你可以使用require.resolve

require('./myModule.js');
delete require.cache[require.resolve('./myModule.js')];
require('./myModule.js');

不清除缓存:

清除缓存: