javascript - 在 Jest 中模拟需要函数
问题描述
我正在尝试使用 Jest 模拟 require ,因为我正在为电子插件系统工作,该插件系统也将NPM
用于解决依赖关系。然后我需要能够在 nodejs 中模拟 require 以便能够测试类似于下一个逻辑的东西。
const load = (installPath, pluginsName, extensionPoint) => {
require.main.paths.push(`${installPath}/node_modules`)
pluginsName.forEach(pluginName => {
let plugin = require(pluginName)
plugin.onLoad(extensionPoint)
});
}
module.exports = { load }
有什么简单的方法可以做到这一点吗?由于require 不是全局的,除了包装和注入它来测试逻辑还有其他方法吗?
解决方案
正如这个答案require
中所解释的,可以通过使用 custom 评估它来替换特定模块require
,类似于Node 如何在内部执行此操作:
const Module = require('module');
const vm = require('vm');
const childModuleAbsPath = path.resolve('./foo/bar.js');
const childModuleBody = fs.readFileSync(childModuleAbsPath);
const childModuleObj = { exports: {} };
const { dir: childModuleDirname, base: childModuleFilename } = path.parse(childModuleAbsPath);
const childRequire = jest.fn().mockReturnValue(...);
vm.runInThisContext(Module.wrap(childModuleBody))(
childModuleObj.exports,
childRequire,
childModuleObj,
childModuleDirname,
childModuleFilename
);
推荐阅读
- python - 将大型 JSON 数组写入文件
- java - 如何防止android中的sql注入攻击?
- c# - OPC UA 订阅不会触发 DataChanged 事件
- angular - Angular 6,角度确认弹出框的自定义模板
- javascript - React - 如何返回上一个分页页面?
- django - 如何在 django 中将选项显示为复选框?
- scala - 为什么谓词不返回布尔值?
- java - 如果 NVIDIA 控制面板设置了计算优化,cuCtxCreate 会失败
- python - 程序计算 0 和 1 的个数
- angular - Angular:具有 NgRx 效果的 JWT 更新