如何用Jest为Angular服务的setUSerprofile函数编写全覆盖测试用例
改进后的Jest测试用例
要实现100%代码覆盖率,需要覆盖setUSerprofile函数的两个分支:finalHeadersfromoAuthUtils存在和不存在的情况,同时修正原测试中的逻辑错误。
原函数分析
你的Angular服务函数:
setUSerprofile() { if (this.finalHeadersfromoAuthUtils) this.userprofile = this.finalHeadersfromoAuthUtils['ext-user-profile-compressed'] }
改进后的测试用例
// 测试分支1:finalHeadersfromoAuthUtils存在时,正确赋值userprofile it('should set userprofile when finalHeadersfromoAuthUtils exists', () => { // 模拟存在的finalHeadersfromoAuthUtils,包含目标字段 const mockProfile = { name: 'test-user', role: 'admin' }; service.finalHeadersfromoAuthUtils = { 'ext-user-profile-compressed': mockProfile }; // 调用目标方法 service.setUSerprofile(); // 验证userprofile是否被正确赋值 expect(service.userprofile).toEqual(mockProfile); }); // 测试分支2:finalHeadersfromoAuthUtils不存在时,不修改userprofile it('should not modify userprofile when finalHeadersfromoAuthUtils does not exist', () => { // 初始化一个初始值 const initialProfile = { name: 'initial-user' }; service.userprofile = initialProfile; // 设置finalHeadersfromoAuthUtils为undefined/null service.finalHeadersfromoAuthUtils = undefined; // 调用目标方法 service.setUSerprofile(); // 验证userprofile仍为初始值 expect(service.userprofile).toEqual(initialProfile); });
原测试的问题说明
- spyOn时机错误:原测试在调用
setUSerprofile之后才创建spy,无法捕获到方法调用,且针对这个函数,验证结果比验证方法是否被调用更有意义 - 测试逻辑偏离:原测试手动给
userprofile赋值后调用方法,没有验证方法的实际赋值逻辑,完全没覆盖函数核心逻辑 - 缺少分支覆盖:没有测试
finalHeadersfromoAuthUtils不存在的情况,无法达到100%覆盖率
内容的提问来源于stack exchange,提问作者nitin
相关产品推荐
相关产品推荐

