首页 > 解决方案 > 在 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 不是全局的,除了包装和注入它来测试逻辑还有其他方法吗?

标签: javascriptnode.jsjestjs

解决方案


正如这个答案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
);

推荐阅读