Apex测试类 - 如何在测试类中设置汇总计数字段

时间:2012-01-13 22:18:25

标签: salesforce apex-code

尝试为测试类中的汇总摘要字段设置值,以改善代码覆盖率。我该怎么做?

public class clsPreferredIASetExt {

    List<PreferredIA__c> preferredias;
    public static PreferredIA__c[]  tobeClosed = new PreferredIA__c[0];
    public static PreferredIA__c[] newPreIAs = new PreferredIA__c[0];
    public static PreferredIA__c loopadd;
    public static PreferredContact__c[] contactlists = new PreferredContact__c[0];
    public static Account[] InvoicedAccounts = new Account[0];
    public static PreferredIA__c[] monkey;

    public clspreferrediaSetExt(ApexPages.StandardSetController controller) {
        preferredias = (List<PreferredIA__c>) controller.getSelected();
    }

    public void getInitCloseInv() {
        tobeclosed = [select id, Account__c, Account__r.id, Account__r.Name,
                             Account__r.AccountNumber, Specialist__c, 
                             PreferredInvoice__c, Status__c
                        from PreferredIA__c where Status__c = 'Invoiced' limit 150];

        list<string> testme = new list<string>{};
        for(PreferredIA__c a:tobeclosed) {
            testme.add(a.Account__r.id);    
        }

        InvoicedAccounts = [select  id, EligibleIAs__c, PreferredOverride__c,   
                                    Preferred_Territory__r.rep__c, LastSurveyDate__c,
                                    InitialInspectionComplete__c, Program_level__c,
                                    PreferredExempt__c, Account_Status__c, 
                                    Active_IAs__c, Last_Training__c
                            from Account where id IN :testme];

        Contactlists = [select   id, Account__c
                            from PreferredContact__c where Account__c IN :testme];

        for(PreferredIA__c q:tobeclosed) {
            q.Status__c = 'Closed'; 
        }

        for(Account z:invoicedaccounts) {
            /****************************************************************
                The following condition is where I am trying to set the z.EligibleIAs__c 
                which is a roll up count field of PreferredIA__c objects associated with 
                the account.
            ****************************************************************/
            if(z.EligibleIAs__c == 0
                && z.Program_Level__c == 'Preferred'
                && !z.PreferredExempt__c
                && (z.Account_Status__c == 'Active'
                    || z.Account_Status__c == 'Product Only')) {

                loopadd = new PreferredIA__c();
                system.debug(z.id);
                system.debug(z.Account_Status__c);
                loopadd.Account__c = z.id;

                if(z.PreferredOverride__c != null) {
                    loopadd.Specialist__c = z.PreferredOverride__c;
                }
                else {
                    loopadd.Specialist__c= z.Preferred_territory__r.Rep__c;
                }

                for(PreferredContact__c q:contactlists) {
                    if(q.Account__c == z.id) {
                        loopadd.PreferredContact__c = q.id;
                    }
                }

                loopadd.CreatedDate__c = Date.Today();
                if(z.Last_training__c != null) {
                    loopadd.DueDate__c = z.Last_Training__c.AddDays(365);
                }
                else {
                    loopadd.DueDate__c = Date.Today().AddDays(365);
                }
                loopadd.initial__c = false;
                loopadd.Status__c = 'Unacknowledged';
                newPreIAs.add(loopadd);
            }
            z.InitialInspectionComplete__c = true;
        }

        try {
            update tobeclosed;
            update invoicedaccounts;
            insert newPreIAs;
        }
        catch(system.dmlexception q) {
            system.debug(q);
            system.debug(invoicedaccounts);
            system.debug(newPreIAs);
        }
    }

    public void ReceivePPW() {
        monkey = [select id, Status__c from PreferredIA__c
                    where id in :preferredias and status__c = 'Training Completed'];

        for (PreferredIA__c m:monkey) {
            m.status__c = 'Awaiting Invoice';
        }

        update monkey;  
    }
}

2 个答案:

答案 0 :(得分:2)

我实际上无法看到你要写到这个字段的位置 - 或者是因为它无效而删除了它?

除此之外,答案是您无法写入汇总摘要字段。如果您需要该字段中的值,则应将子记录插入到父测试记录中,并使用适当的字段值,以便汇总字段计算值。

另外,我可以看到你在开始时查询PerferredIA__c,你的测试方法绝不应该依赖于系统中的数据,你应该自己在测试代码中插入你的记录。这样做的原因是,如果您尝试部署到没有相关数据的组织,那么您的测试将失败,因此,您的部署将会失败。

答案 1 :(得分:0)

对于这样的情况,请考虑mock objects (or just variables simulating expected values),类似于插入测试值,如Lacey建议的那样。例如,这种技术在进行标注时需要达到100%的覆盖率,因为它们在通话时终止测试。