无法在Salesforce中使用Process Builder部署APEX类



我想部署一个包含APEX类,测试类和调用Apex类的过程的软件包。在我开发课程的沙箱上,代码覆盖率为100%。当我尝试将其部署到另一个沙盒/生产中时,它失败了,因为它显示代码覆盖率为65%。

我相信问题是因为过程构建器在部署时无效,因此整个代码未涵盖。我应该如何进行此操作?

我已经尝试执行以下操作:

  • 首先部署过程构建器以在部署类之前激活它。部署过程构建器失败。
  • 在没有过程构建器的情况下部署类;代码覆盖率为65%。
  • 更改测试类以容纳更多案例。这是不可能的,因为我更改了代码来与Process Builder一起使用,因此我找不到一种测试方法。
  • 当过程构建器被激活并停用时,我运行了测试代码。它在停用时显示了65%的覆盖范围,激活时的覆盖率为100%,因为在测试类中插入记录时,该过程构建器被调用。

我的代码将客户电子邮件发送并使用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;
    }
}

我必须创建插入/更新的帐户记录的克隆,以便使用过程构建器。使用此方法,更改仅在克隆中进行。如果未使用过程构建器,则测试类获取空值,而不是Hashed_email__pc字段中的实际哈希值,从而导致测试失败。当使用过程构建器时,克隆中所做的更改反映在实际记录中,并且测试通过。即使我没有调用该代码部分的测试方法,该过程构建器涵盖了它。

我无法找到一种创建测试类的方法,其中当过程构建器停用时返回正确的值。我必须使用DML插入记录,以便可以克隆它。

在这种情况下,我应该如何测试Apex类?

我注视着这个,但这应该让你去

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(...)
    }
}

我们已经看到了部署无效PB的问题。请确保PB的部署故障并不是因为沙盒在新版本中比生产更新 - 我们在新释放的预览窗口中遇到了该版本,当我们的沙盒通常在即将发布的版本上时,但产品却不是。

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

希望这会有所帮助。

您是否不得不将PB推动为无活动?还是您的包裹中活跃?您是使用Eclipce/迁移工具还是更改设置来推动代码?如果PB在您的软件包中处于活动状态,那么它可能是Scott提到的ORG版本问题。解决方法是在不依赖PB的情况下直接在测试类中测试您的课程。您可以在对象记录上进行CRUD,并在测试类中模拟您的PB逻辑以完全测试您的代码。

最新更新