无法在Salesforce

时间:2017-03-06 14:13:52

标签: salesforce apex-code processbuilder apex

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

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

我已经尝试过以下操作:

  • 首先部署流程构建器以在部署类之前将其激活。部署流程构建器失败。
  • 在没有进程构建器的情况下部署类;代码覆盖率为65%。
  • 更改测试类以适应更多案例。这是不可能的,因为我更改了代码以使用流程构建器,我找不到测试它的方法。
  • 我在激活和停用流程构建器时运行了测试代码。它在被停用时显示为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;
    }
}

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

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

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

3 个答案:

答案 0 :(得分:1)

我注视了这一点,但这应该让你前进

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

    }
}

答案 1 :(得分:0)

我们已经看到部署非活动PB的问题。确保PB的部署失败不是因为沙盒的版本比生产版本更新 - 我们在新发布的预览窗口期间遇到了这个问题,当时我们的沙箱经常出现在即将发布的版本中但是prod不是。

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

希望这有帮助。

答案 2 :(得分:0)

您是否想要将PB推向非活动状态?或者它在你的包装中是否有效? 您使用Eclipce / Migration工具还是更改设置来推送代码? 如果PB在您的包中处于活动状态,那么它可能是Scott提到的组织版本问题。 解决方法是在测试类中直接测试您的类,而不依赖于PB。您可以对对象记录执行CRUD并在测试类中模拟PB逻辑以完全测试代码。