0

0

Jest 中正确设置模块内函数的逐测试用例 Mock 实现

花韻仙語

花韻仙語

发布时间:2026-03-18 13:40:13

|

244人浏览过

|

来源于php中文网

原创

Jest 中正确设置模块内函数的逐测试用例 Mock 实现

本文详解如何在 Jest 中为同一被 mock 函数在不同测试用例中动态配置独立的 mockImplementation,解决因作用域错误导致的 “Cannot find function” 报错问题。

本文详解如何在 jest 中为同一被 mock 函数在不同测试用例中动态配置独立的 `mockimplementation`,解决因作用域错误导致的 “cannot find function” 报错问题。

在 Jest 单元测试中,我们常需对依赖模块中的函数进行模拟(mock),尤其当多个测试用例需要不同行为逻辑时(例如一个测试返回双倍和、另一个返回差值的一半),自然希望在每个 test() 块内单独调用 mockImplementation()。但若直接使用未声明的函数名(如 addNumbers.mockImplementation(...)),Jest 会报错:ReferenceError: addNumbers is not defined —— 这是因为 jest.mock() 创建的 mock 是模块级导出对象的一部分,并非全局变量,无法直接访问。

✅ 正确做法:通过导入模块实例访问 mock 函数

必须先 require(或 import)被 mock 的模块,再通过该模块对象访问其 mock 方法。这是关键所在:mock 函数仅存在于模块导出对象上,而非作用域顶层

以下为修正后的完整示例:

一点PPT
一点PPT

一句话生成专业PPT,AI自动排版配图

下载
const request = require("supertest");
const app = require("../app");
// ✅ 必须显式导入被 mock 的模块,以获取其 mock 实例
const addFunc = require("./addFunc");

// 全局 mock 模块:替换 ./addFunc 为含 jest.fn() 的模拟对象
jest.mock("./addFunc", () => ({
  addNumbers: jest.fn()
}));

test("Testing add function with double result", async () => {
  // ✅ 正确:通过 addFunc.addNumbers 访问 mock 函数
  addFunc.addNumbers.mockImplementation((a, b) => 2 * (a + b));

  const res = await request(app).post("/addNumbers").send({ a: 1, b: 2 });
  expect(res.body.result).toBe(6);
});

test("Testing add function with half result", async () => {
  // ✅ 同样通过模块实例调用,且可覆盖前一用例的实现
  addFunc.addNumbers.mockImplementation((a, b) => (a - b) / 2);

  const res = await request(app).post("/addNumbers").send({ a: 6, b: 2 });
  expect(res.body.result).toBe(2);
});

⚠️ 关键注意事项

  • 拼写校验:mockImplementation 易误写为 mockImplentation(漏掉 "me"),Jest 不会报语法错误,但调用无效 → 导致函数仍执行原始逻辑或 undefined,务必检查。
  • 模块导入时机:require("./addFunc") 必须在 jest.mock() 之后执行,否则将获得原始模块而非 mock 版本(Jest 的 mock hoisting 机制要求 mock 声明优先)。
  • 自动清理(推荐):为避免测试间污染,可在 beforeEach 中重置 mock,或使用 mockReset() / mockRestore():
    beforeEach(() => {
      addFunc.addNumbers.mockReset(); // 清空调用记录与实现
    });
  • ESM 用户注意:若项目使用 ES Modules,应改用 import * as addFunc from "./addFunc" 并确保 jest.mock() 位置符合 ESM 规则(通常置于文件顶部,配合 jest.unstable_mockModule 或 Babel 插件)。

✅ 总结

“Cannot find function” 的根本原因不是 Jest 配置错误,而是 JavaScript 作用域理解偏差:jest.mock() 创建的是模块导出对象上的属性,而非全局绑定。只要坚持「先 mock → 再 import → 最后通过模块对象调用 mock 方法」这一流程,并注意拼写与清理,即可安全、灵活地为每个测试用例定制函数行为,大幅提升测试覆盖率与可维护性。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
require的用法
require的用法

require的用法有引入模块、导入类或方法、执行特定任务。想了解更多require的相关内容,可以阅读本专题下面的文章。

510

2023.11.27

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

103

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

126

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

3

2026.03.17

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

6625

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

3356

2024.08.14

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

1721

2025.12.25

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

500

2023.08.04

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

3

2026.03.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号