1

1 晩に 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