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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:32:34