2012-06-12 4 views
0

케이스 에스컬레이션을 위해 apex 클래스를 작성했습니다. 그것을위한 테스트 클래스를 작성하고 싶습니다. 누군가 나를 도울 수 있습니까? 아래 코드는 내가 작성한 코드입니다.apex 클래스의 테스트 케이스

global class CaseEscalation implements Database.Batchable<SObject> 

{ 

global CaseEscalation() 

{ 

} 

global Database.QueryLocator start(Database.BatchableContext ctx) 

{ 

    System.debug('checking======='); 

    return Database.getQueryLocator([SELECT CaseNumber, CreatedDate,Status FROM Case    where (Status!='Closed' AND Status!='Escalated') and CreatedDate<TODAY ]); 

} 


global void execute(Database.BatchableContext ctx, List<Sobject> scope) 

{ 

    List<Case> ca = (List<Case>)scope; 

    System.debug('checking======='+ca); 

    for(Case c : ca) 

    {  

      System.Debug(c); 
      String emailMessage = 'The case ' + c.CaseNumber + ' has been ecalated ' + ' Please look into the case ' + 'Thankyou'; 

      Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage(); 

      String[] toAddresses = new String[] {'[email protected]'}; 

      mail.setToAddresses(toAddresses); 

      mail.setSubject('Case Escalation'); 

      mail.setPlainTextBody(emailMessage); 

      Messaging.sendEmail(new Messaging.SingleEmailMessage[]{ mail }); 

      c.Status = 'Escalated'; 

    } 

    if(ca.size()>0) 

    update ca; 

     } 

global void finish(Database.BatchableContext ctx) 

{ 

} 


} 

답변

0

코드를 사용하여 현재의 방식으로 배치를 쉽게 테스트 할 수 없습니다. 이는 테스트 데이터를 만들 때 오늘 날짜로 생성되므로 쿼리 로케이터가 레코드를 반환하지 않고 실행 메서드가 실행되지 않기 때문입니다.

배치를 조정하여 작동 가능하도록했습니다.

global class CaseEscalation implements Database.Batchable<SObject> { 

    private static Date cutOff; 

    global CaseEscalation(Date CutOffDate){ 
     cutOff = CutOffDate; 
    } 

    global Database.QueryLocator start(Database.BatchableContext ctx){ 
     return Database.getQueryLocator('SELECT Id, CaseNumber, CreatedDate, Status FROM Case WHERE (Status != \'Closed\' AND Status != \'Escalated\') and CreatedDate < :cutOff '); 
    } 

    global void execute(Database.BatchableContext ctx, List<Sobject> scope){ 

     if(scope.size() == 0) 
      return; 

     for(Case c : (List<Case>)scope){  
      String emailMessage = 'The case ' + c.CaseNumber + ' has been ecalated ' + ' Please look into the case ' + 'Thankyou'; 
      Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage(); 
      String[] toAddresses = new String[] {'[email protected]'}; 
      mail.setToAddresses(toAddresses); 
      mail.setSubject('Case Escalation'); 
      mail.setPlainTextBody(emailMessage); 
      Messaging.sendEmail(new Messaging.SingleEmailMessage[]{ mail }); 

      c.Status = 'Escalated'; 
     } 

     update scope; 
    } 

    global void finish(Database.BatchableContext ctx){ 

    } 
} 

일단 이것을 사용하면 테스트가 실행되었음을 증명할 수 있습니다. 배치 실행 메서드 내에서 한 번에 10 개 이상의 전자 메일을 보낼 수 없으므로 배치를 실행할 때 scope 매개 변수를 execute 메서드에 전달해야합니다. 간단히 말해서 execute 메소드의 루프 내에서 전자 메일의 본문을 작성한 다음 업데이트 된 레코드의 세부 정보가 모두 포함 된 전자 메일 하나 (전자 메일 하나, 훨씬 더 깨끗한받은 편지함 및 없음)를 보내는 것이 좋습니다. 주지사 한도에 대한 우려. 나는 당신의 원래 코드에 최대한 가깝게하고 싶었 기 때문에 이것을하지 않았다.

그러면 코드를 실행하기 위해 다음과 같은 테스트 스크립트를 작성할 수 있습니다. 테스트에주의 할

@isTest 
private class CaseEscalationTest { 

    private static testMethod void testInCutOff(){ 

     List<Case> testCases = new List<Case>(); 

     for(Integer i = 0; i < 10; i++) 
      testCases.add(new Case(Status='Open')); 

     insert testCases; 

     Test.startTest(); 

     CaseEscalation ce = new CaseEscalation(system.today().addDays(1)); 
     database.executeBatch(ce, 10); 

     Test.stopTest(); 

     testCases = [SELECT Id FROM Case WHERE Status = 'Open']; 

     system.assertEquals(0, testCases.size()); 

    } 

    private static testMethod void testOUtOfCutOff(){ 

     List<Case> testCases = new List<Case>(); 

     for(Integer i = 0; i < 10; i++) 
      testCases.add(new Case(Status='Open')); 

     insert testCases; 

     Test.startTest(); 

     CaseEscalation ce = new CaseEscalation(system.today()); 
     database.executeBatch(ce, 10); 

     Test.stopTest(); 

     testCases = [SELECT Id FROM Case WHERE Status = 'Open']; 

     system.assertEquals(10, testCases.size()); 

    } 

} 

상황이 Test.startTest()Test.stopTest()이 때문에 시험을 계속 당신에게 데이터베이스에서 업데이트 된 데이터를 선택하고 수 있습니다 보장 할 수있는 기회를주기 전에 실행하는 배치를 강제로 사용됩니다 당신이 예상했던대로 바뀌 었습니다. 앞서 말했듯이 'database.executeBatch()`메서드는 두 번째 매개 변수를 전달하여 범위의 레코드 수를 제한해야하므로 execute 메서드의 구조를 변경하여이 메서드를 제거 할 수 있습니다. 한 가지 유의할 점은 배치를 테스트하기 위해 하나 이상의 레코드를 작성하는 것이 좋지만 하나의 테스트에서 호출되는 하나의 execute 메소드 만 가질 수 있으므로 하나 이상의 "범위 (scope)"가치를 생성하지 않는 것을 기억하십시오.