Jest spyOn模拟含回调参数的函数失效,代码覆盖率未达标
问题分析与修正
你的测试代码存在几个关键问题,导致回调内的setState无法被覆盖率统计到,当前模拟方式不正确,具体问题和修正方案如下:
存在的问题
- 对象拼写错误:原函数中是
window.__promos(复数形式),但测试代码里写成了window.__promo(单数),导致Spy没有挂载到正确的方法上,根本无法拦截目标调用。 - mockImplementation参数写法错误:你当前的写法
mockImplementation(('gift', cb) => { ... })是语法错误,逗号表达式会忽略第一个参数,实际只接收了cb,正确的应该是接收事件名和回调两个参数的函数。 - 未调用原函数
func:测试代码里没有执行func,原函数的逻辑(包括调用event方法和触发回调)根本没有运行,自然覆盖不到回调内的setState。 - 未跟踪
setState:没有对setState做模拟或跟踪,无法验证其是否被调用,也不利于覆盖率工具统计代码执行情况。
修正后的测试代码
// 测试前初始化全局对象,确保window.__promos存在 beforeEach(() => { window.__promos = { holiday: { event: jest.fn() } }; }); test('window.__promos.holiday.event的回调正确触发setState', () => { // 模拟setState函数,用于跟踪调用 const mockSetState = jest.fn(); // 根据实际场景调整setState的挂载方式,这里假设全局可访问 global.setState = mockSetState; // 正确挂载Spy到目标方法,处理事件名和回调参数 jest.spyOn(window.__promos.holiday, 'event').mockImplementation((eventName, cb) => { if (eventName === 'gift') { cb('test-data'); } }); // 关键:调用原函数,触发内部逻辑 func(); // 验证event方法被正确调用 expect(window.__promos.holiday.event).toHaveBeenCalledWith('gift', expect.any(Function)); // 验证setState被回调触发,参数正确 expect(mockSetState).toHaveBeenCalledWith('test-data'); });
核心修正要点
- 修正
__promos的拼写,确保Spy指向正确的对象方法 - 正确编写
mockImplementation的函数,接收完整参数并触发回调 - 必须调用
func函数,执行原函数的业务逻辑 - 模拟
setState并跟踪其调用,确保回调内的代码被执行并被覆盖率工具统计
内容的提问来源于stack exchange,提问作者Hithesh kumar
相关产品推荐
相关产品推荐

