假设有一个需要从父级/引用包的根目录动态加载依赖项的npm包,且该位置在运行时未知,则必须执行动态require操作:
// config-fetcher.js
const path = require('path');
const getRunningProjectRoot = require('./get-running-project-root');
module.exports = filename =>
require(path.resolve(getRunningProjectRoot(), filename));
(不能保证模块将出现在 node_modules
中。它可能是符号链接或全局加载的。因此,它不能使用静态 require。)
这是从实际代码简化而来的,所以除非你知道一种相对于正在运行的项目根目录非动态地要求文件的方法,否则只能采用这种方式。
现在,为了测试这个,我宁愿不依赖任何实际上存在于磁盘上的文件。但是,Jest 似乎不允许您模拟不存在的文件。所以,如果我尝试这样做:
const mockFileContents = {};
jest.mock('/absolute/filename.blah', () => mockFileContents);
// in preparation for wanting to do this:
const result = require('./config-fetcher')('/absolute/filename.blah');
expect(result).toBe(mockFileContents);
然后我收到了来自 jest-resolve
的错误,文件为 Resolver.resolveModule
,报错信息为 Error: Cannot find module '/absolute/filename.blah'.
我需要测试这个动态导入模块的一些功能,因为它处理了一些相对路径和绝对路径的情况,并且允许您通过符号指定一个特殊路径,例如 applicationRoot
,所以模块 config-fetcher
负责较难的工作而不是调用者。
有没有人能够提供如何测试此模块或如何重新结构化使得动态导入不再需要或更容易被测试的指导?