我正在尝试模拟使用Jest的需求,因为我正在开发用于电子的插件系统,该系统还将使用NPM
来解决依赖性。
然后,我需要能够在nodejs内部模拟需求,以便能够测试与下一个逻辑类似的东西。
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 is not a global一样,除了包装和注入它以测试逻辑之外,还有其他方法吗?
答案 0 :(得分:1)
如this answer中所述,可以通过使用自定义require
对其进行评估来替换特定模块中的require
,类似于Node does this internally:
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
);