无法在 Salesforce 中使用流程构建器部署 apex class

Cannot deploy apex class with process builder in Salesforce

我想部署一个包含顶点 class、测试 class 和调用顶点 class 的进程构建器的包。在我开发class的沙盒上,代码覆盖率是100%。当我试图将它部署到另一个 sandbox/production 时,它失败了,因为它显示代码覆盖率为 65%。

我认为问题是因为流程构建器在部署时处于非活动状态,因此没有覆盖整个代码。我该如何处理?

我已尝试执行以下操作:


我的代码获取客户电子邮件并使用 CryptoUtil.generateHashDigest 方法将其转换为散列,然后将其保存在散列电子邮件字段中。

Public static void newRecord(List<Account> listAccounts) {
    for(Account a : listAccounts) {
        Account updacc=[select id from account where id = :a.id];
        String message = String.valueof(a.get('Customer_Email__pc'));
        String hashDigest = CryptoUtil.generateHashDigest(message);
        updacc.Hashed_email__pc = HashDigest;
        update updacc;
    }
}

我必须创建帐户记录的克隆 inserted/updated 才能使用流程生成器。使用此方法,更改仅在克隆中进行。如果未使用流程构建器,测试 class 会得到 Null 值而不是 Hashed_email__pc 字段中的实际哈希值,这会导致测试失败。使用流程构建器时,克隆中所做的更改反映在实际记录中,并且测试通过。即使我没有调用这部分代码的测试方法,测试也会通过流程构建器覆盖它。

我想不出创建测试 class 的方法,在停用流程构建器时返回正确的值。我必须使用 DML 来插入记录,以便它可以被克隆。

在这种情况下,我应该如何测试顶点class?

我们发现了部署非活动 PB 的问题。请确保 PB 的部署失败不是因为沙箱的版本比生产版本更新 - 我们 运行 在新版本预览 windows 期间对此进行了研究,当时我们的沙箱通常是即将发布的版本但产品不是。

我们已经开始编写测试 classes 来覆盖我们的流程构建器。您应该能够编写测试来测试通过 PB 处理的预期系统行为。示例:在记录更新时,您的 class 更新各种内容,您的 PB 更新各种其他内容并发送电子邮件提醒。您的测试 class 可以扩展以涵盖 PB 进行的更新并检查它是否按预期发送电子邮件。

希望对您有所帮助。

您是否习惯于将 PB 设置为不活动?还是它在您的包裹中有效? 您是否使用 Eclipce/Migration 工具或更改集来推送代码? 如果 PB 在您的包中处于活动状态,那么它可能是 Scott 提到的组织版本问题。 解决方法是在测试 class 中直接测试您的 class,而不依赖 PB。您可以对对象记录进行增删改查,并在测试中模拟您的PB逻辑class以全面测试您的代码。

我注意到了这一点,但这应该能让你继续前进

public static void newRecord(List<Account> listAccounts) 
{
    List<Account> accountsToUpdate = new List<Account>();

    for(Account a : listAccounts) 
    {
        String message;
        String hashDigest;

        Account account = new Account();

        if(a.Customer_Email__pc != null)
        {
            message = String.valueof(a.get('Customer_Email__pc'));
            hashDigest = CryptoUtil.generateHashDigest(message);
            account.Hashed_email__pc = HashDigest;
            account.ID = a.ID;
            accountsToUpdate.add(account);
        }          
    }

    if(!accountsToUpdate.isEmpty())
    {
       update accountsToUpdate;
    }
}



@isTest
private class Test_Account
{   
    // -------- Variables --------
    private static List<Account> testAccount;

    // -------- Shared Methods --------
    // Initialization of test data example
    private static void init(Integer testType)
    {
        testAccount = new List<Account>();

        if(testType == 1)
        {
            for(Integer i = 0; i < 10; i++)
            {
                Account a = new Account();
                //build your accounts..
                testAccount.add(a);
            }

            insert testAccount;
        }
    }

    // -------- Test Methods --------
    private static testMethod void testAccountHash()
    {
        init(1);

        Test.startTest();
        //Because this is an actual public method, I would just test the method

        newRecord(testAccount);

        Test.stopTest();

        List<Account> accountResult = [SELECT .... FROM Account];


        //Assert
        System.assertNotEquals(...)

    }
}