Angular中如何用Karma-Jasmine单元测试嵌套if条件实现100%覆盖率
问题根因
你当前遇到的分支覆盖率不足问题由两个核心原因导致:
- 缺少averageRating为大于0的整数的测试场景,导致内层
if (this.averageRating % 1 > 0)的false分支完全没有被执行过 - 现有测带小数场景的用例断言完全无效:
expect(component.noRatings).toEqual(component.noRatings)无论变量是什么值都会通过,没有验证逻辑执行结果 - 所有用例没有显式设置依赖属性
totalRating,依赖组件默认值可能导致测试结果不稳定
解决方案
调整后的单元测试代码如下,覆盖所有4个逻辑分支,即可达成100%覆盖率:
describe('calculateRatingSummary', () => { // 每次用例执行前初始化依赖值,避免用例间互相干扰 beforeEach(() => { // 根据你之前0分时长度为5的逻辑,设置总星级为5,可根据实际业务调整 component.totalRating = 5; }); it('averageRating大于0且带小数时,avgRatingCollection长度为整数部分值', () => { component.averageRating = 2.3; component.calculateRatingSummary(); expect(component.avgRatingCollection.length).toBe(2); }); it('averageRating带小数时,avgRatings取整数部分', () => { component.averageRating = 3.6; component.calculateRatingSummary(); expect(component.avgRatings).toEqual(3); }); it('averageRating小于等于0时,noRatingsCollection长度等于总星级', () => { component.averageRating = 0; component.calculateRatingSummary(); expect(component.noRatingsCollection.length).toEqual(5); // 补充负数场景验证else分支兼容性 component.averageRating = -1.5; component.calculateRatingSummary(); expect(component.noRatingsCollection.length).toEqual(5); }); it('averageRating大于0且带小数时,noRatings会额外减1', () => { component.averageRating = 4.1; component.calculateRatingSummary(); // 总星级5,整数部分4,有小数所以5-4-1=0,验证内层if为true的逻辑 expect(component.noRatings).toBe(0); expect(component.noRatingsCollection.length).toBe(0); }); // 新增缺失场景:覆盖内层if为false的分支 it('averageRating大于0且为整数时,noRatings不执行减1逻辑', () => { component.averageRating = 3.0; component.calculateRatingSummary(); // 总星级5,整数部分3,无小数所以5-3=2,验证内层if不触发的逻辑 expect(component.noRatings).toBe(2); expect(component.noRatingsCollection.length).toBe(2); }); });
调整后外层if的true/false分支、内层if的true/false分支全部被执行且有有效断言验证,运行覆盖率命令即可得到100%的分支覆盖率。
内容的提问来源于stack exchange,提问作者Julio Rodríguez
相关产品推荐
相关产品推荐

