我正在编写一个规范,根据global.window的存在来测试javascript文件中的差异。有没有办法导入或需要两次特定文件?设置global.window之前和之后一次。
正在测试的文件如下所示:
let someObject = (windowExists => {
return windowExists ? 'abc' : '123';
})(typeof window !== 'undefined');
export default someObject;
我希望使用这种模式,但看起来似乎并不可行,因为common.js和es6模块都只包含一次文件并在此后处理缓存版本。
答案 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
模块获得相同的结果,但一般原则仍然存在: