1

我有一个可安排的课程,每晚会被叫一次。我已经匿名运行代码,一切正常。我遇到的问题是我无法对其进行适当的测试覆盖!我编写了一个我认为应该可以工作的测试类,但由于某种原因,我的 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 循环中专门引用某些内容以供它们触发?这个类应该能够自己运行所有东西,而无需插入记录进行测试。我错过了什么?

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

4

1 回答 1

2

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

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

@isTest (SeeAllData = true) 

以前,只需要:

@isTest

您可以在此处阅读有关测试类和这个新“功能”的更多信息:Apex 测试类注释

于 2012-10-03T18:27:54.360 回答