gpt4 book ai didi

node.js - 使用 Jest 在 Node 中模拟动态需求

转载 作者:搜寻专家 更新时间:2023-11-01 00:34:52 24 4
gpt4 key购买 nike

给定一个 npm 包需要从父/引用包的根目录动态加载依赖项,并且该位置直到运行时才知道,它必须执行动态要求:

// config-fetcher.js
const path = require('path');
const getRunningProjectRoot = require('./get-running-project-root');
module.exports = filename =>
require(path.resolve(getRunningProjectRoot(), filename));

(不能保证模块将在 node_modules 中。它可以是符号链接(symbolic link)或全局加载。所以它不能使用静态要求。)

这是从实际代码中简化而来的,因此除非您知道一种相对于正在运行的项目根目录非动态地要求文件的方法,否则必须采用这种方式。

现在,为了对此进行测试,我宁愿不依赖于磁盘上实际存在的任何文件。然而,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 代替调用者完成艰苦的工作。

任何人都可以提供有关如何测试此模块的指导,或者如何重组以便不需要动态需求或更易于测试的指导吗?

最佳答案

您可以在 jest.mock 中将 { virtual: true } 作为 options 传递模拟一个不存在的模块:

const { myFunc } = require('does not exist');

jest.mock('does not exist',
() => ({
myFunc: () => 'hello'
}),
{ virtual: true }
);

test('mock file that does not exist', () => {
expect(myFunc()).toBe('hello'); // Success!
});

详情

Jest 完全接管被测代码的 require 系统。

它有自己的模块缓存并跟踪模块模拟。

作为该系统的一部分,Jest 允许您为实际不存在的模块创建模拟。

您可以将options 作为第三个参数传递给jest.mock。目前唯一的选项是virtual,如果是true那么Jest会简单的把调用模块工厂函数的结果添加到模块缓存中并在被测代码需要时返回它。

关于node.js - 使用 Jest 在 Node 中模拟动态需求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56052045/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com