给定一个 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
。它可以被符号链接或全局加载。所以它不能使用静态要求。)
这是从实际代码中简化的,因此除非您知道一种相对于正在运行的项目根非动态地要求文件的方法,否则必须采用这种方式。
现在,为了测试这一点,我不想依赖磁盘上实际存在的任何文件。然而,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
代替调用者做艰苦的工作。
任何人都可以提供有关如何测试此模块或如何重组以便不需要动态需求或者更容易测试的指导吗?