两次导入或需要 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
模块实际上有更多方法可以达到同样的效果,但总的原则仍然是:
- 将 JavaScript 待测代码作为字符串加载
- 创建一个 pre-determined 您希望脚本在其中执行的全局状态
- 执行脚本
- 观察结果
这比大多数人意识到的要容易。所有需要的模块都存储在 require.cache
上。您可以简单地从缓存中删除模块,然后要求它不再从缓存中拉取模块。缓存模块的关键是模块的完整路径,如果你不想输入完整路径,你可以使用require.resolve
。
require('./myModule.js');
delete require.cache[require.resolve('./myModule.js')];
require('./myModule.js');
不清除缓存:
清除缓存:
我正在编写一个规范,以根据 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
模块实际上有更多方法可以达到同样的效果,但总的原则仍然是:
- 将 JavaScript 待测代码作为字符串加载
- 创建一个 pre-determined 您希望脚本在其中执行的全局状态
- 执行脚本
- 观察结果
这比大多数人意识到的要容易。所有需要的模块都存储在 require.cache
上。您可以简单地从缓存中删除模块,然后要求它不再从缓存中拉取模块。缓存模块的关键是模块的完整路径,如果你不想输入完整路径,你可以使用require.resolve
。
require('./myModule.js');
delete require.cache[require.resolve('./myModule.js')];
require('./myModule.js');
不清除缓存:
清除缓存: