如何测试提前终止的函数?Jest框架下函数返回终止测试方案
嘿,这个问题我熟!测试提前终止的函数其实核心就是两点:确认函数在特定条件下确实停下了,以及后面的逻辑没跑起来。结合你给的Jest+React组件的例子,我给你一步步理清楚~
测试提前终止函数的通用思路
不管用什么测试框架,测试提前终止的函数都要覆盖两个核心点:
- 验证提前返回的行为:确认函数在触发条件下确实返回了(返回值符合预期,比如
undefined或者特定值) - 验证后续逻辑未执行:如果函数提前终止后还有未执行的代码(比如副作用、其他方法调用),要确认这些逻辑没有被触发
针对你的Jest测试用例的具体实现
首先得纠正一个小问题:你原来的测试里传了undefined作为参数,但typeof undefined的结果是"undefined",并不满足typeof parameter === 'object'的条件,所以不会触发提前终止。要测试提前返回的场景,你需要传入typeof结果为"object"的参数(比如{}、null、[]这些)。
1. 测试提前终止的场景
这个测试要验证:当传入object类型参数时,函数立即返回,且后续逻辑不执行。假设你的myFunction后续会调用this.doStuff方法,我们可以用Jest的间谍函数来监视这个方法是否被调用:
it('myFunction() should return early when passed an object-like parameter', () => { // SETUP:浅渲染组件,并监视后续逻辑的方法 const wrapper = shallow(<Component />); const doStuffSpy = jest.spyOn(wrapper.instance(), 'doStuff'); // EXECUTE:传入触发提前终止的参数(比如空对象) const result = wrapper.instance().myFunction({}); // VERIFY:断言函数返回undefined,且后续方法未被调用 expect(result).toBeUndefined(); expect(doStuffSpy).not.toHaveBeenCalled(); });
如果你的myFunction后续没有调用其他方法,而是直接修改组件state,也可以用间谍函数监视setState,确认它没被触发:
it('myFunction() should return early without modifying state', () => { const wrapper = shallow(<Component />); const setStateSpy = jest.spyOn(wrapper.instance(), 'setState'); wrapper.instance().myFunction(null); // null的typeof也是"object" expect(setStateSpy).not.toHaveBeenCalled(); });
2. 测试正常执行的场景
除了提前终止的情况,还要验证当参数符合要求时,函数会执行完整逻辑:
it('myFunction() should execute full logic when passed non-object parameter', () => { const wrapper = shallow(<Component />); const doStuffSpy = jest.spyOn(wrapper.instance(), 'doStuff'); wrapper.instance().myFunction('valid-string'); // 传入非object类型参数 // 断言后续方法被正常调用 expect(doStuffSpy).toHaveBeenCalled(); });
额外注意点
- JS里
typeof null === 'object'是历史遗留的小坑,如果你不想让null触发提前终止,需要把条件改成typeof parameter === 'object' && parameter !== null - 如果你的函数是纯函数(没有副作用),只需要断言返回值即可;如果有副作用,一定要验证副作用是否符合预期
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

