You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Salesforce Trigger测试类覆盖率停在71%,Role__c关联if条件未覆盖如何解决

问题描述

当前遇到Salesforce Apex代码测试覆盖率异常问题:DrawingSharing触发器功能运行完全正常,但测试类覆盖率始终停留在71%无法提升,粗斜体标注的代码段未被测试类覆盖,核心问题为测试类未命中Role__c字段对应的if判断逻辑。

问题代码

触发器代码

trigger DrawingSharing on Drawing__c (after insert) {    
    if(trigger.isInsert){ 
        for (Drawing__c draw : Trigger.new){  
            System.debug('draw: '+draw);
            List<Installation__c> ListInstalltionList = new List <Installation__c>();
            for(String installationActivityList :draw.Installation_Activity__c.split(';')){
                Installation__c inst = new Installation__c();
                inst.Drawing_ID__c = draw.Id;
                inst.Installation_Activity__c=installationActivityList;
                inst.Execution__c=draw.Execution_ID__c;
                inst.Floor__c=draw.Floors__c;
                ListInstalltionList.add(inst);
            }
            system.debug('ListInstalltionList==>'+ListInstalltionList);
            insert ListInstalltionList;            
            List<Drawing__c> newList = new List<Drawing__c>();
            newList.add(draw);
            Map <Id,Id> DrawingProjectMap = new Map<Id,Id>();
            Map<Id,Drawing__c> drawingIdObjMap = new Map<Id,Drawing__c>([select id, name,Approver__c, Execution_ID__r.Project__c from Drawing__c where id in :newList limit 1]);
            for(Drawing__c Drawing : drawingIdObjMap.values())
            { 
                DrawingProjectMap.put(Drawing.Id,Drawing.Execution_ID__r.Project__c);
            }
            system.debug(DrawingProjectMap);
            Map<Id,RoleObjectSharing__mdt> roleobjaccessmap = new Map<Id,RoleObjectSharing__mdt>([select id,Object__c,role__c,Accesslevel__c from RoleObjectSharing__mdt where Object__c='Drawing']);
            Map<String,String> RoleAccessmap = new Map<String,String>(); 
            for(RoleObjectSharing__mdt Robj : roleobjaccessmap.values()){
                RoleAccessmap.put(Robj.role__c,Robj.Accesslevel__c);   
            }
            system.debug(RoleAccessmap.keySet());
            system.debug(DrawingProjectMap.values());           
            Map<Id,Projects__c> teamrolemap = new Map<Id,Projects__c>([select Id,(select id, User_Lookup__c,Role__c from TeamRoles__r where Role__c in:RoleAccessmap.keySet()) from Projects__c where Id in :DrawingProjectMap.values()]);
            system.debug('teamrolemap'+teamrolemap);
            List <Drawing__Share> DrawShareList = new List<Drawing__Share>();
            List <Drawing__c> DrawList = new List<Drawing__c>(); 
            INTEGER countFound = 0;
            for(Drawing__c drawobj : newList){                                                         
                Projects__c proj = teamrolemap.get(DrawingProjectMap.get(drawobj.id));
                system.debug(proj.teamroles__r);
                for(teamroles__c tr : proj.teamroles__r){
                    system.debug(tr);
                    if(tr.Role__c == 'PlanningEngineer' || tr.Role__c == 'AssistantPlanningEngineer' || tr.Role__c == 'PlanningManager' || tr.Role__c == 'AssistantPlanningManager' && countFound <=0) {
                        countFound = countFound + 1;
                        Drawing__c ddd = drawingIdObjMap.values();
                        ddd.Approver__c = tr.User_Lookup__c;
                        DrawList.add(ddd);
                    }     
                    Drawing__Share recruiterShr = new Drawing__Share();
                    recruiterShr.ParentId = drawobj.Id;   
                    recruiterShr.UserOrGroupId = tr.User_Lookup__c;
                    recruiterShr.AccessLevel = RoleAccessmap.get(tr.role__c);
                    recruiterShr.RowCause = tr.role__c+'__c';
                    DrawShareList.add(recruiterShr);
                }
                system.debug(DrawShareList);
            }
            upsert DrawList; 
            Database.SaveResult[] lsr = Database.insert(DrawShareList,false);
            Integer i=0;
            for(Database.SaveResult sr : lsr){
                if(!sr.isSuccess()){     
                }
                i++;
            } 
        }
    }  
}

现有测试类代码

static testMethod void Test4(){ 
        System.debug('TestSharing = Test4'); 
        Test.startTest();        
        Projects__c proj = new Projects__c();
        proj.Name = 'Hello';
        proj.LL_Location__c='Mumbai';
        insert proj;
        
        TeamRoles__c tr1 = new TeamRoles__c();
        tr1.User_Lookup__c = UserInfo.getUserId(); 
        tr1.Role__c = 'PlanningEngineer';
        tr1.Project_Name__c = proj.Id;
        insert tr1;
        
        TeamRoles__c tr2 = new TeamRoles__c();
        tr2.User_Lookup__c = UserInfo.getUserId(); 
        tr2.Role__c = 'PlanningManager';
        tr2.Project_Name__c = proj.Id;
        insert tr2;
        
        Execution__c ex = new Execution__c();
        ex.Project__c = proj.Id;
        insert ex;
        
        Item_Master__c ItemeMaster = new Item_Master__c();
        ItemeMaster.Item_Description__c = 'testing';
        ItemeMaster.Item_Code__c = 'testing';
        insert ItemeMaster;
        
        Project_Items__c projItems = new Project_Items__c();
        projItems.Total_PO_Quantity__c = 0;
        projItems.ItemMaster__c = ItemeMaster.Id;
        projItems.Execution__c = ex.Id;
        insert projItems;
        
        List<TeamRoles__c> lstTR = new List<TeamRoles__c>();
        TeamRoles__c tr7 = new TeamRoles__c();
        tr7.User_Lookup__c = UserInfo.getUserId();
        tr7.Role__c = 'PlanningEngineer';
        tr7.Project_Name__c = proj.Id;
        lstTR.add(tr7);
        
        List<Drawing__c> d= new List<Drawing__c>(); 
        Drawing__c draw = new Drawing__c();
        draw.Execution_Id__c = ex.Id;
        draw.Floors__c='5F';
        draw.Installation_Activity__c='Cable Tray';
        draw.Drawing_Line_Items_Count__c = 0;
        d.add(draw);
        insert d;
        //insert draw;
        
        Installation__c inst = new Installation__c();
        inst.Drawing_ID__c=draw.Id;
        inst.Floor__c= draw.Floors__c;
        inst.Installation_Activity__c='Cable Tray';
        inst.As_built_Marked_Drawing_Prepared_by_Site__c =False;
        inst.Execution__c = ex.Id;
        insert inst;
        
        SharingUtilityClass suc = new SharingUtilityClass();
        suc.initObjSharing(lstTR);
        
        Drawing_Line_Items__c dll = new Drawing_Line_Items__c();
        dll.Drawing_Number__c = draw.Id;
        dll.Project_Items__c = projItems.Id;
        dll.Project_Name__c = proj.Id;
        dll.Installation_Activity__c='Cable Tray';
        dll.GFC_Quantity__c = 15;
        dll.Shop_Drawing_Quantity__c = 20;
        dll.GFC_Drawing_Line_Item_Done__c = true;
        dll.Shop_Drawing_Line_Item_Done__c=true;
        insert dll;
        
        Installation_Line_Items__c instline = new Installation_Line_Items__c();
        instline.Installation__c = inst.Id;
        instline.Project_Items__c = projItems.Id;
        instline.Installation_Activity__c='Cable Tray';
        instline.Total_installed_quantity_DPR_Quantity__c = 100.00;
        insert instline;

        List<Drawing_Line_Items__c> listProj2 = CircularProgressController.getDrawingLineItem(dll.Id);
        List<Drawing_Line_Items__c> listProj3 = CircularProgressController.getDrawingLineItemShop(dll.Id);
        List<Drawing__c> listProj4 = Drawing.getDrawing(draw.Id);
        List<Project_Items__c> listProj5 = Drawing.getProjectItems(ex.Id);

        Test.stopTest(); 
}

问题根因

  1. 测试环境默认不会加载组织的RoleObjectSharing__mdt自定义元数据,触发器查询该元数据返回空,导致RoleAccessmap为空,后续Projects__c关联TeamRoles__r的子查询过滤条件Role__c in:RoleAccessmap.keySet()返回空,整个for(teamroles__c tr : proj.teamroles__r)循环完全不执行,标注代码段自然没有被覆盖。
  2. 触发器存在语法错误:Drawing__c ddd = drawingIdObjMap.values(); 中values()返回的是List集合,不能直接赋值给单个sObject对象,之前功能正常只是实际场景未走到该分支,需要优先修复。

修复方案

  1. 修复触发器语法错误,将错误行替换为:
Drawing__c ddd = drawingIdObjMap.get(drawobj.Id);
  1. 给测试方法添加@isTest(SeeAllData=true)注解,确保测试环境可以读取到RoleObjectSharing__mdt的元数据内容。
  2. 现有测试类已经插入了PlanningEngineer、PlanningManager两个符合IF判断条件的TeamRoles__c记录,元数据可访问后即可命中IF分支,覆盖率直接提升到100%。
  3. 建议在Test.stopTest()后添加断言,校验Installation__c生成数量、Drawing__c.Approver__c赋值结果、Drawing__Share共享记录是否符合预期,避免无意义的覆盖率刷取。

内容的提问来源于stack exchange,提问作者apz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 15:42:01