如何在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完整加载所有功能:
- 先安装jsdom:
npm install jsdom --save-dev
- 在你的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
相关产品推荐
相关产品推荐

