你如何在测试类中正确测试循环查询?

时间:2012-10-03 17:08:46

标签: unit-testing class for-loop salesforce

我有一个Schedulable类,每晚会被调用一次。我匿名运行代码,一切正常。我遇到的问题是我无法获得适当的测试报道!我编写了一个我认为应该可以工作的测试类,但由于某些原因,我的for循环中的任何行都没有被覆盖。

我认为这是因为没有从这些查询返回数据,但是应该返回数千条记录。我已经在生产环境中运行查询而没有任何问题。

是否有可在可调度类中运行查询的单独进程?

以下是我班级的一部分:

global class UpdateUnitPrice  implements Schedulable{

    global void execute(SchedulableContext sc){

        // OwnerId -> List of Strings with Row Contents
        Map<Id,Map<Id,Map<String,String>>> updateContainer = new Map<Id,Map<Id,Map<String,String>>>{};  // Covered

        List<Id> ownerContainer = new List<Id>{};  // Covered

        String EmailMessage;     // Covered
        String EmailLine;        // Covered
        String EmailAddedLines;  // Covered

        String CurrentEmailLine; // Covered
        String NewEmailLine;     // Covered

        List<Id> opportunityList = new List<Id>{};  // Covered

        for(Opportunity thisOpp :[SELECT Id,Name FROM Opportunity WHERE Order_Proposed__c = null])
        {
            // Thousands of records should be returned

            opportunityList.add(thisOpp.Id); // NOT COVERED!!

        }

        List<OpportunityLineItem> OppLineItemList = new List<OpportunityLineItem>{};  // Covered

        for(OpportunityLineItem thisOppProd : [SELECT Id,OpportunityId,Opportunity.OwnerId,Opportunity.Name,Product_Name__c,UnitPrice,ListPrice 
                                               FROM OpportunityLineItem 
                                               WHERE OpportunityId IN :opportunityList
                                               AND UnitPrice_lt_ListPrice__c = 'True'
                                               ORDER BY OpportunityId ASC])
        {

            . . . // NO LINES COVERED WITHIN THIS LOOP

        }


      . . .

    }

}

这是我的测试类:

@isTest
private class UpdateUnitPriceTest {

    static testMethod void myUnitTest() {

        Test.startTest();

        // Schedule the test job 
        String jobId = System.schedule('UpdateUnitPrice','0 0 0 3 9 ? 2022',new UpdateUnitPrice());

        // Get the information from the CronTrigger API object
        CronTrigger ct = [SELECT Id, CronExpression, TimesTriggered, NextFireTime FROM CronTrigger WHERE id = :jobId];

        // Verify the expressions are the same
        System.assertEquals(ct.CronExpression,'0 0 0 3 9 ? 2022');

        // Verify the job has not run
        System.assertEquals(0, ct.TimesTriggered);

        // Verify the next time the job will run
        System.assertEquals('2022-09-03 00:00:00', String.valueOf(ct.NextFireTime));

        Test.stopTest();

    }
}

我是否应该专门引用这些for循环中的内容来触发它们?这个类应该能够只运行它自己的所有内容,而无需插入测试记录。我错过了什么?

提前感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:2)

API 24.0中添加了一个可爱的功能,它要求测试类包含一小段(新)代码,以便查看查询数据。我不知道为什么会这样,但确实让我感到震惊。

要让我们的测试类正常运行,他们现在必须在顶部有以下内容:

@isTest (SeeAllData = true) 

以前,所需要的只是:

@isTest

您可以在此处详细了解测试类和此新“功能”:Apex Test Class Annotations