在Jest中模拟功能

时间:2018-09-26 07:32:29

标签: javascript node.js jestjs

我正在尝试模拟使用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一样,除了包装和注入它以测试逻辑之外,还有其他方法吗?

1 个答案:

答案 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
);