
如何用jest-when优雅实现条件化Mock返回值3分钟快速上手教程【免费下载链接】jest-whenJest support for mock argument-matched return values.项目地址: https://gitcode.com/gh_mirrors/je/jest-whenjest-when是一款专为Jest设计的测试工具它让开发者能够轻松实现基于参数匹配的条件化Mock返回值无需在mockImplementation中编写复杂的分支逻辑。本文将带你快速掌握这个强大工具的核心用法让你的单元测试代码更简洁、更易维护。 一分钟安装指南使用npm或yarn快速安装jest-when到开发依赖npm install --save-dev jest-when # 或 yarn add --dev jest-when安装完成后在测试文件中导入核心APIimport { when } from jest-when如果你使用CommonJS模块系统也可以通过require导入const { when } require(jest-when) 核心用法参数匹配与返回值设定jest-when的核心语法非常直观通过when函数包裹Jest mock或spy然后链式调用calledWith指定参数最后用mockReturnValue系列方法设置返回值// 基础参数匹配 when(fn).calledWith(1).mockReturnValue(one) when(fn).calledWith(2).mockReturnValue(two) // 异步函数支持 when(fetchUser).calledWith(1).mockResolvedValue({ id: 1, role: admin }) when(fetchUser).calledWith(2).mockRejectedValue(new Error(not found))这种写法比传统的mockImplementation方式更清晰// ❌ 传统方式复杂的条件分支 fn.mockImplementation((num) { if (num 1) return one if (num 2) return two return default }) // ✅ jest-when方式链式参数匹配 when(fn).calledWith(1).mockReturnValue(one) when(fn).calledWith(2).mockReturnValue(two) when(fn).mockReturnValue(default) // 默认返回值 高级匹配技巧jest-when支持多种参数匹配方式满足不同场景需求1. 多样化参数类型匹配// 数字匹配 when(fn).calledWith(1).mockReturnValue(number) // 对象匹配 when(fn).calledWith({ role: admin }).mockReturnValue(object) // 数组匹配 when(fn).calledWith([1, 2, 3]).mockReturnValue(array) // 正则表达式匹配 when(fn).calledWith(/abc/).mockReturnValue(regex) // null值匹配 when(fn).calledWith(null).mockReturnValue(null)2. 自定义匹配函数通过when包裹 predicate 函数创建自定义匹配器// 创建自定义匹配器 const divisibleBy3 when((arg) arg % 3 0) // 使用自定义匹配器 when(fn).calledWith(divisibleBy3).mockReturnValue(divisible by 3)3. 多参数匹配// 精确匹配多个参数 when(fn).calledWith(1, true, foo).mockReturnValue(yay!) 常用API速查表jest-when提供了丰富的API以下是最常用的几个API功能描述when(fn).calledWith(...)设定参数匹配规则mockReturnValue(value)为匹配调用返回值mockResolvedValue(value)为匹配调用返回Promise resolved值mockRejectedValue(error)为匹配调用返回Promise rejected值resetWhenMocks()重置单个mock的所有训练resetAllWhenMocks()重置所有mock的训练 实际应用示例假设我们有一个用户服务需要测试根据不同用户ID返回不同结果的场景// 用户服务测试 import { when } from jest-when; import { getUser } from ./userService; // 模拟API调用 jest.mock(./api, () ({ fetchUser: jest.fn() })); import { fetchUser } from ./api; describe(getUser, () { it(should return admin user when id is 1, async () { // 设置条件化返回值 when(fetchUser).calledWith(1).mockResolvedValue({ id: 1, name: Admin User, role: admin }); const result await getUser(1); expect(result).toEqual({ id: 1, name: Admin User, role: admin, permissions: expect.any(Array) }); }); }); 最佳实践保持测试简洁每个when链只测试一个条件让测试意图更清晰设置默认返回值通过when(fn).mockReturnValue(...)设置默认行为避免未匹配调用返回undefined及时清理在afterEach中调用resetAllWhenMocks()确保测试间隔离结合Jest断言可以使用expectCalledWith验证调用参数// 验证调用参数 when(fn).expectCalledWith(1).mockReturnValue(x) 为什么选择jest-when保留Jest风格无需学习全新的API沿用熟悉的mockReturnValue等方法提高可读性链式调用让条件逻辑一目了然减少样板代码避免复杂的条件分支和switch语句类型安全完整的TypeScript支持提供良好的开发体验通过jest-when你可以告别混乱的mock实现用更优雅的方式编写条件化Mock让单元测试变得更加清晰和可维护。现在就尝试将它加入你的测试工具箱吧【免费下载链接】jest-whenJest support for mock argument-matched return values.项目地址: https://gitcode.com/gh_mirrors/je/jest-when创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考