You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Mocha中测试含jQuery Promises的代码?Deferred调用报错解决

解决Mocha测试中$.Deferred is not a function的问题

我之前也踩过类似的坑,其实问题核心在于Node.js环境下jQuery的加载逻辑和浏览器不一样,而且大概率是你的jQuery加载方式没让Deferred功能正常生效。下面给你两个靠谱的解决办法:

先排查基础问题:确认安装的是完整版jQuery

首先检查你的package.json里的jQuery依赖——如果是slim版本的jQuery,那肯定没有$.Deferred,因为slim版砍掉了Ajax、Deferred这些非核心功能。如果是这种情况,先重新安装完整版:

npm install jquery --save-dev

方案一:用jsdom模拟浏览器环境(推荐)

jQuery的很多功能(包括Deferred)依赖浏览器的window/document对象,在纯Node环境下直接引入jQuery,它不会加载这些依赖环境的模块。所以我们可以用jsdom模拟一个浏览器环境,让jQuery完整加载所有功能:

  1. 先安装jsdom:
npm install jsdom --save-dev
  1. 在你的Mocha测试文件最开头添加这段代码:
const { JSDOM } = require('jsdom');
// 创建一个模拟的DOM环境
const dom = new JSDOM('<!DOCTYPE html>');
// 把模拟的window和document挂到全局,让jQuery能找到它们
global.window = dom.window;
global.document = dom.window.document;

// 现在再引入jQuery,就能拿到完整功能了
global.$ = global.jQuery = require('jquery');

之后运行测试,$.Deferred()应该就能正常调用了——这个方法最贴近真实浏览器环境,后续测试其他jQuery功能也不容易出问题。

方案二:手动引入jQuery的Deferred模块(应急可用)

如果不想装jsdom,也可以尝试直接引入jQuery内部的Deferred模块,不过这个方法依赖jQuery的内部结构,版本更新后可能失效:

const jQuery = require('jquery');
// 手动加载Deferred模块并挂载到jQuery上
jQuery.Deferred = require('jquery/src/deferred');
global.$ = global.jQuery = jQuery;

最后可以验证一下:在测试代码里加一行console.log($.Deferred),如果输出是一个函数,就说明配置成功了。

内容的提问来源于stack exchange,提问作者JorgeDLuffy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:00:14