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

请求编写Salesforce Apex测试类:销售共享逻辑验证

需求说明

我开发了Salesforce的Apex共享类Sharing_Sales,要实现以下业务逻辑:

  • 创建**销售代表分配(Sales_Rep_Assignment__c)**记录,或把该记录设为激活状态时,将关联的Account及Order共享给对应销售代表
  • 删除该记录,或把该记录设为非激活状态时,移除销售代表对相关记录的编辑权限;重新激活则再次共享

以下是修正后的实现代码,以及对应的Apex测试类。


修正后的共享类代码

public with sharing class Sharing_Sales {
    public static void SharingRelatedOrdersAndAccount(List<Sales_Rep_Assignment__c> triggerNew, 
            Map<Id, Sales_Rep_Assignment__c> oldMap){
        List<Sales_Rep_Assignment__c> activeAssignments = new List<Sales_Rep_Assignment__c>();
        Set<Id> accIds = new Set<Id>();
        Set<Id> salesRepsIds = new Set<Id>();
        Map<Id, List<Order>> ordersByAccountId = new Map<Id, List<Order>>();

        // 筛选出需要激活共享的分配记录
        for(Sales_Rep_Assignment__c sar: triggerNew){
            if(sar.Active__c == true && (oldMap == null || oldMap.get(sar.Id).Active__c == false)) {
                activeAssignments.add(sar);
                salesRepsIds.add(sar.Sales_Reps__c);
                accIds.add(sar.Account__c);
            }
        }

        // 批量查询关联的Order
        for(Order ord : [SELECT Id, AccountId FROM Order WHERE AccountId IN :accIds]) {
            if (!ordersByAccountId.containsKey(ord.AccountId)) {
                ordersByAccountId.put(ord.AccountId, new List<Order>());
            }
            ordersByAccountId.get(ord.AccountId).add(ord);
        }
        
        List<OrderShare> orderSharingRecords = new List<OrderShare>();
        List<AccountShare> accountSharingRecords = new List<AccountShare>();

        // 生成Account和Order的共享记录
        for (Sales_Rep_Assignment__c srs : activeAssignments) {
            // 处理Account共享
            AccountShare accShare = new AccountShare();
            accShare.AccountId = srs.Account__c;
            accShare.AccountAccessLevel = 'Edit';
            accShare.UserOrGroupId = srs.Sales_Reps__c;
            accShare.RowCause = Schema.AccountShare.RowCause.Manual;
            accountSharingRecords.add(accShare);

            // 处理Order共享
            if(ordersByAccountId.containsKey(srs.Account__c)){
                for (Order ord : ordersByAccountId.get(srs.Account__c)) {
                    OrderShare orderShare = new OrderShare();
                    orderShare.OrderId = ord.Id;
                    orderShare.OrderAccessLevel = 'Edit';
                    orderShare.UserOrGroupId = srs.Sales_Reps__c;
                    orderShare.RowCause = Schema.OrderShare.RowCause.Manual;
                    orderSharingRecords.add(orderShare);
                }
            }
        }

        // 统一执行DML,避免多次操作
        if(!accountSharingRecords.isEmpty()){
            insert accountSharingRecords;
        }
        if(!orderSharingRecords.isEmpty()){
            insert orderSharingRecords;
        }
    }  

    public static void SharingOrderAndAccountIsDelete(List<Sales_Rep_Assignment__c> triggerNew, 
            Map<Id, Sales_Rep_Assignment__c> oldMap){
        List<Sales_Rep_Assignment__c> inactiveOrDeletedAssignments = new List<Sales_Rep_Assignment__c>();
        Set<Id> accIds = new Set<Id>();
        Set<Id> salesRepsIds = new Set<Id>();

        // 处理更新为非激活的场景
        if(triggerNew != null){
            for(Sales_Rep_Assignment__c sar: triggerNew){
                if(sar.Active__c == false && oldMap != null && oldMap.get(sar.Id).Active__c == true){
                    inactiveOrDeletedAssignments.add(sar);
                    salesRepsIds.add(sar.Sales_Reps__c);
                    accIds.add(sar.Account__c);
                }
            }
        } else {
            // 处理删除记录的场景,从oldMap中获取已删除的激活记录
            for(Sales_Rep_Assignment__c sar: oldMap.values()){
                if(sar.Active__c == true){
                    inactiveOrDeletedAssignments.add(sar);
                    salesRepsIds.add(sar.Sales_Reps__c);
                    accIds.add(sar.Account__c);
                }
            }
        }

        // 查询需要删除的共享记录
        List<AccountShare> accSharesToDelete = [
            SELECT Id FROM AccountShare 
            WHERE AccountId IN :accIds 
            AND UserOrGroupId IN :salesRepsIds
            AND RowCause = 'Manual'
        ];
        List<OrderShare> orderSharesToDelete = [
            SELECT Id FROM OrderShare 
            WHERE OrderId IN (SELECT Id FROM Order WHERE AccountId IN :accIds)
            AND UserOrGroupId IN :salesRepsIds
            AND RowCause = 'Manual'
        ];

        // 统一删除共享记录
        if(!accSharesToDelete.isEmpty()){
            delete accSharesToDelete;
        }
        if(!orderSharesToDelete.isEmpty()){
            delete orderSharesToDelete;
        }
    }
}

对应的Apex测试类

@isTest
private class Sharing_Sales_Test {
    @testSetup
    static void setupTestData(){
        // 创建测试销售代表用户
        Profile testProfile = [SELECT Id FROM Profile WHERE Name = 'Standard User' LIMIT 1];
        User testSalesRep = new User(
            FirstName = 'Test',
            LastName = 'Rep',
            Email = 'test.rep@example.com',
            Username = 'test.rep' + System.now().getTime() + '@example.com',
            Alias = 'testrep',
            TimeZoneSidKey = 'America/Los_Angeles',
            LocaleSidKey = 'en_US',
            EmailEncodingKey = 'UTF-8',
            LanguageLocaleKey = 'en_US',
            ProfileId = testProfile.Id
        );
        insert testSalesRep;

        // 创建测试Account
        Account testAcc = new Account(Name = 'Test Account');
        insert testAcc;

        // 创建关联的测试Order
        Order testOrder = new Order(
            AccountId = testAcc.Id,
            EffectiveDate = Date.today(),
            Status = 'Draft'
        );
        insert testOrder;
    }

    // 测试:创建激活的分配记录,验证共享记录生成
    @isTest
    static void testCreateActiveAssignment(){
        User testSalesRep = [SELECT Id FROM User WHERE Username LIKE '%test.rep%' LIMIT 1];
        Account testAcc = [SELECT Id FROM Account WHERE Name = 'Test Account' LIMIT 1];

        Sales_Rep_Assignment__c assignment = new Sales_Rep_Assignment__c(
            Account__c = testAcc.Id,
            Sales_Reps__c = testSalesRep.Id,
            Active__c = true
        );
        insert assignment;

        // 验证Account共享记录存在
        List<AccountShare> accShares = [
            SELECT Id FROM AccountShare 
            WHERE AccountId = :testAcc.Id 
            AND UserOrGroupId = :testSalesRep.Id
            AND AccountAccessLevel = 'Edit'
        ];
        System.assertEquals(1, accShares.size(), 'Account共享记录未生成');

        // 验证Order共享记录存在
        Order testOrder = [SELECT Id FROM Order WHERE AccountId = :testAcc.Id LIMIT 1];
        List<OrderShare> orderShares = [
            SELECT Id FROM OrderShare 
            WHERE OrderId = :testOrder.Id 
            AND UserOrGroupId = :testSalesRep.Id
            AND OrderAccessLevel = 'Edit'
        ];
        System.assertEquals(1, orderShares.size(), 'Order共享记录未生成');
    }

    // 测试:将激活记录改为非激活,验证共享记录删除
    @isTest
    static void testDeactivateAssignment(){
        User testSalesRep = [SELECT Id FROM User WHERE Username LIKE '%test.rep%' LIMIT 1];
        Account testAcc = [SELECT Id FROM Account WHERE Name = 'Test Account' LIMIT 1];
        Order testOrder = [SELECT Id FROM Order WHERE AccountId = :testAcc.Id LIMIT 1];

        Sales_Rep_Assignment__c assignment = new Sales_Rep_Assignment__c(
            Account__c = testAcc.Id,
            Sales_Reps__c = testSalesRep.Id,
            Active__c = true
        );
        insert assignment;

        // 将记录改为非激活
        assignment.Active__c = false;
        update assignment;

        // 验证Account共享记录已删除
        List<AccountShare> accShares = [
            SELECT Id FROM AccountShare 
            WHERE AccountId = :testAcc.Id 
            AND UserOrGroupId = :testSalesRep.Id
        ];
        System.assertEquals(0, accShares.size(), 'Account共享记录未删除');

        // 验证Order共享记录已删除
        List<OrderShare> orderShares = [
            SELECT Id FROM OrderShare 
            WHERE OrderId = :testOrder.Id 
            AND UserOrGroupId = :testSalesRep.Id
        ];
        System.assertEquals(0, orderShares.size(), 'Order共享记录未删除');
    }

    // 测试:将非激活记录重新激活,验证共享记录重新生成
    @isTest
    static void testReactivateAssignment(){
        User testSalesRep = [SELECT Id FROM User WHERE Username LIKE '%test.rep%' LIMIT 1];
        Account testAcc = [SELECT Id FROM Account WHERE Name = 'Test Account' LIMIT 1];
        Order testOrder = [SELECT Id FROM Order WHERE AccountId = :testAcc.Id LIMIT 1];

        Sales_Rep_Assignment__c assignment = new Sales_Rep_Assignment__c(
            Account__c = testAcc.Id,
            Sales_Reps__c = testSalesRep.Id,
            Active__c = false
        );
        insert assignment;

        // 改为激活状态
        assignment.Active__c = true;
        update assignment;

        // 验证Account共享记录重新生成
        List<AccountShare> accShares = [
            SELECT Id FROM AccountShare 
            WHERE AccountId = :testAcc.Id 
            AND UserOrGroupId = :testSalesRep.Id
            AND AccountAccessLevel = 'Edit'
        ];
        System.assertEquals(1, accShares.size(), 'Account共享记录未重新生成');

        // 验证Order共享记录重新生成
        List<OrderShare> orderShares = [
            SELECT Id FROM OrderShare 
            WHERE OrderId = :testOrder.Id 
            AND UserOrGroupId = :testSalesRep.Id
            AND OrderAccessLevel = 'Edit'
        ];
        System.assertEquals(1, orderShares.size(), 'Order共享记录未重新生成');
    }

    // 测试:删除激活的分配记录,验证共享记录删除
    @isTest
    static void testDeleteActiveAssignment(){
        User testSalesRep = [SELECT Id FROM User WHERE Username LIKE '%test.rep%' LIMIT 1];
        Account testAcc = [SELECT Id FROM Account WHERE Name = 'Test Account' LIMIT 1];
        Order testOrder = [SELECT Id FROM Order WHERE AccountId = :testAcc.Id LIMIT 1];

        Sales_Rep_Assignment__c assignment = new Sales_Rep_Assignment__c(
            Account__c = testAcc.Id,
            Sales_Reps__c = testSalesRep.Id,
            Active__c = true
        );
        insert assignment;

        // 删除分配记录
        delete assignment;

        // 验证Account共享记录已删除
        List<AccountShare> accShares = [
            SELECT Id FROM AccountShare 
            WHERE AccountId = :testAcc.Id 
            AND UserOrGroupId = :testSalesRep.Id
        ];
        System.assertEquals(0, accShares.size(), 'Account共享记录未删除');

        // 验证Order共享记录已删除
        List<OrderShare> orderShares = [
            SELECT Id FROM OrderShare 
            WHERE OrderId = :testOrder.Id 
            AND UserOrGroupId = :testSalesRep.Id
        ];
        System.assertEquals(0, orderShares.size(), 'Order共享记录未删除');
    }
}

补充说明

  1. 原代码已修正多处逻辑错误:包括共享记录的正确赋值、DML操作批量优化、删除场景的完整处理,以及补充了需求中要求的Account共享逻辑
  2. 测试类使用@testSetup统一初始化测试数据,提升测试执行效率
  3. 测试覆盖了所有业务场景,确保共享逻辑的正确性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 11:15:32