2017-07-25 3 views
0

J'ai créé un déclencheur qui appelle une future classe pour faire appel à une url tierce, tout fonctionne bien ici mais la classe de test ne couvre pas les champs d'opportunité IsWon & Est fermé. De quelle modification ai-je besoin dans la classe de test pour obtenir une couverture de code d'au moins 75% pour ce déclencheur.Comment écrire la classe de test pour le déclenchement d'apex sur l'opportunité

// déclencheur Apex

trigger oppTrigger on Opportunity (before update) { 

String oppType = ''; 
for(Opportunity opp : Trigger.new){ 

if (opp.IsClosed == true){ // closed 
    if (opp.IsWon == true){ 
    oppType = 'Won'; // closed-won 
    }else{ 
    oppType = 'Lost'; // closed-lost 
    } 
} else { // open 
     oppType = 'Open'; 
    } 
    // call a method with @future annotation 
    futureCls.srvcCallout(opp.id,opp.Amount,oppType); 
} 
} 

// future classe de déclenchement avec la méthode future

global class futureCls { 
@future(callout=true) 
Public static void srvcCallout(String oppId, Decimal oppAmt, String oppType){ 

    // Create http request 
    HttpRequest req = new HttpRequest(); 
    req.setMethod('POST'); 
    req.setHeader('Content-Type', 'application/json;charset=UTF-8');  
    req.setEndpoint('https://www.testurl.com/salesforce/opp-change'+'?id='+oppId+'&amt='+oppAmt+'&stage='+oppType); 

    // create web service 
    Http http = new Http(); 
     try { 
     // Execute web service call here  
     HTTPResponse res = http.send(req); 
     // Debug messages 
     System.debug('RESPONSE:'+res.toString()); 
     System.debug('STATUS:'+res.getStatus()); 
     System.debug('STATUS_CODE:'+res.getStatusCode()); 
     System.debug('BODY:'+res.getBody()); 

     } catch(System.CalloutException e) { 
      // Exception handler 
      System.debug('Error connecting to Paperless..'); 
     } 
    } 
} 

// classe de test pour la détente où je suis bloqué: -

@isTest 
private class futureCls_Test { 

private static testMethod void srvcCallout_Test() {   

    Test.startTest(); 

    // Unit test to cover trigger update event 
    Opportunity opp = new Opportunity(Name='test opp', StageName='stage', Probability = 95, CloseDate=system.today()); 
    insert opp; 
    opp.Amount = 1000; 
    opp.StageName = 'Closed/Won'; 
    update opp; 

    // Assign some test values 
    String oppId = '1sf2sfs2'; 
    Decimal oppAmt = 4433.43; 
    String oppType = 'Won'; 

    // Unit test to cover future method 
    futureCls.srvcCallout(oppId, oppAmt,oppType);  

    // Unit test to cover http web service 
    Test.setMock(HttpCalloutMock.class, new futureClsCalloutMock()); 
    Test.stopTest(); 

    } 
} 

Répondre

1

Votre classe de test devra faire ce qui suit pour toucher tout ce déclencheur:

Notez que ceci est juste une façon de le faire, vous pouvez le faire de plusieurs façons différentes

  • Créez une nouvelle occasion
  • Mise à jour l'occasion à un certain statut qui est « ouvert »
  • Créer une nouvelle opportunité
  • Mise à jour l'occasion de Fermé/perdu
  • Créer une nouvelle occasion
  • la possibilité de mise à jour Fermé/Won

Si vous me demandez, une fonction TestDataFactory qui a créé l'occasion et mis à jour à un état spécifié serait utile:

@isTest 
public testOpportunityWithStatusChange(targetStatus){ 
    //do stuff here 
}; 

Vous pouvez ensuite appeler cette usine une fois pour chaque statut vous vouliez vérifier dans votre classe de test pour couvrir le déclencheur.

+0

Dans l'édition que vous avez effectuée pour inclure la classe de test, vous devez simplement répéter la création d'opportunité et la mise à jour pour CHAQUE statut mis en évidence dans votre instruction if/else dans le déclencheur. – pburns1587