使用Jest/Enzyme测试renderColumnDropdown函数覆盖率不足问题求助
解决Jest/Enzyme测试中switch语句case未覆盖的问题
嘿,我来帮你搞定这个测试覆盖率的问题!先看你的代码和测试里的两个核心问题:
- 你测试里传的
columnIdList是数组,但原代码用Object.keys()遍历,这说明它应该是键值对对象,数组格式会导致遍历逻辑根本没触发正确的case分支。 - 你的测试只覆盖了
pivotanalysis这一个case,像sort、filters这些分支完全没被测试到,覆盖率自然是0啦。
下面给你分步拆解的解决方案:
1. 先修正props的传递格式
把测试里的columnIdList改成对象格式,比如:
wrapper.setProps({ columnIdList: { pivotanalysis: 'Pivot Analysis' } })
2. 为每个switch case单独写测试
要让每个分支都被执行到,就得针对性地给每个case写测试:
测试返回false的case(sort/filters/group等)
it('returns false when key is "sort"', () => { wrapper.setProps({ columnIdList: { sort: 'Sort Column' } }); const result = wrapper.instance().renderColumnDropdown(); // 因为map遍历后数组里是false,直接检查结果数组 expect(result).toEqual([false]); }); it('returns false when key is "filters"', () => { wrapper.setProps({ columnIdList: { filters: 'Filter Options' } }); const result = wrapper.instance().renderColumnDropdown(); expect(result).toEqual([false]); }); // 按照同样的方式,给group、dimensions、pivot、pivotanalysis分别写测试
测试default分支
it('renders an <option> element for non-matching keys', () => { wrapper.setProps({ columnIdList: { custom_col: 'My Custom Column' } }); const result = wrapper.instance().renderColumnDropdown(); // 用shallow包裹结果,检查option的属性和文本 const option = shallow(result[0]); expect(option.prop('value')).toBe('custom_col'); expect(option.text()).toBe('My Custom Column'); });
3. 写一个多key的综合测试
你还可以加一个测试,同时包含多个不同类型的key,确保多个分支一起被触发:
it('handles multiple keys including default', () => { wrapper.setProps({ columnIdList: { sort: 'Sort', custom: 'Custom Column' } }); const result = wrapper.instance().renderColumnDropdown(); expect(result).toEqual([false, <option value="custom" key="custom">Custom Column</option>]); });
小提示
- 注意哦,
renderColumnDropdown函数是没有参数的,你测试里传的{defaultData:{filters:[{ column:''}]}}根本没用,因为函数里用的是this.props,所以调用的时候直接写wrapper.instance().renderColumnDropdown()就好。 - 重新运行覆盖率命令的时候,记得用
npm test -- --coverage(两个横杠不能少),这样就能看到所有case都被覆盖啦!
内容的提问来源于stack exchange,提问作者user 9191
相关产品推荐
相关产品推荐

