使用Jest模拟ProgressBar与SweetAlert,解决单元测试报错问题
解决测试myjs.js时的ProgressBar未定义与swal模拟问题
我来帮你一步步搞定这两个测试难题,顺便纠正代码里的小疏漏:
1. 修复"ProgressBar is not defined"错误
你的myjs.js在全局作用域直接使用了ProgressBar,但测试脚本里只是require了progressbar.js,没有把它挂载到全局对象上。修改test.js,把ProgressBar添加到全局环境:
const $ = require('jquery'); global.$ = global.jQuery = $; // 将ProgressBar挂载到全局,匹配myjs.js的全局引用方式 global.ProgressBar = require('progressbar.js'); var myJs = require('./myjs.js'); // 注意路径要正确,确保能找到myjs.js文件
2. 模拟全局的swal函数
myFunc里调用了全局的swal弹窗函数,测试时我们不需要实际触发弹窗,所以要提前模拟这个函数。用Jest的话有两种常用方式:
方法一:直接声明全局模拟函数
在引入myjs.js之前添加这段代码:
// 模拟全局swal函数,空实现即可满足基础测试 global.swal = jest.fn();
方法二:使用jest.spyOn(可验证调用细节)
如果需要验证swal是否被正确调用、参数是否符合预期,可以用这种方式:
// 先声明全局swal,再创建监听 spy global.swal = jest.fn(); // 在测试用例里添加验证逻辑 test('test myFunc returns 3 and calls swal correctly', ()=> { const result = myJs.myFunc(1, 2); expect(result).toBe(3); // 验证swal的调用参数(注意原myjs.js里有笔误:para应该是par) expect(global.swal).toHaveBeenCalledWith("Info", 3); // 1+2的结果是3 })
3. 纠正测试代码的关键错误
你原来的测试代码里expect(myJs.myFunc).toBe(3);是错的——你在判断函数本身是否等于3,而不是调用函数后的返回值。必须调用myFunc并传入参数,再断言返回结果:
test('test if myFunc returns 3',()=> { // 调用myFunc,传入任意两个参数(比如1和2) const returnValue = myJs.myFunc(1, 2); expect(returnValue).toBe(3); })
额外提醒:myjs.js里的笔误
你的myjs.js中swal("Info",para);这里的para应该是par(前面定义的变量是var par = para1 + para2;),这个笔误会导致运行时错误,测试时也会报错,记得先修复这个问题!
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

