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

时间:2016-01-26 21:34:28

标签: javascript node.js mocha

我正在编写一个规范,根据global.window的存在来测试javascript文件中的差异。有没有办法导入或需要两次特定文件?设置global.window之前和之后一次。

正在测试的文件如下所示:

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

export default someObject;

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

2 个答案:

答案 0 :(得分:8)

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

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

不清除缓存:

清除缓存:

答案 1 :(得分:0)

您可以使用vm.runInContext()函数对给定的,可能是隔离的上下文执行任意JavaScript(作为字符串)。在该上下文中,您可以将window的值设置为undefined或任何其他适合您需求的值。

实际上有更多方法可以使用vm模块获得相同的结果,但一般原则仍然存在:

  1. 将测试中的JavaScript代码作为字符串加载
  2. 创建一个预定的全局状态,您希望在
  3. 中执行该脚本
  4. 执行脚本
  5. 观察结果