Skip to main content

Testare i trigger Apex

Obiettivi di apprendimento

Al completamento di questa unità, sarai in grado di:

  • Scrivere il test di un trigger attivato da un'operazione eseguita su un singolo record.
  • Eseguire tutti i metodi di test di una classe.
Nota

Nota

Stai seguendo la formazione in italiano? Inizia la sfida in un Trailhead Playground in italiano e utilizza le traduzioni fornite tra parentesi per la navigazione. Per quanto riguarda i valori da inserire, copia e incolla solo quelli in lingua inglese, perché la convalida della sfida è basata sul fatto che i dati siano in inglese. Se non superi la sfida nella tua organizzazione italiana, ti consigliamo di (1) selezionare Stati Uniti per le impostazioni internazionali, (2) selezionare Inglese per la lingua seguendo le istruzioni riportate qui e, successivamente, (3) fare nuovamente clic sul pulsante "Controlla la sfida".

Visita il badge Trailhead nella tua lingua per informazioni dettagliate su come usufruire dell'esperienza Trailhead in altre lingue.

Testare i trigger Apex

Prima di distribuire un trigger, è bene scrivere dei test di unità per eseguire le azioni che attivano il trigger e verificare i risultati siano quelli attesi.

Eseguiamo un test su un trigger con cui abbiamo lavorato nel modulo Trigger Apex. Se in un record account sono presenti opportunità correlate, il trigger AccountDeletion impedisce l'eliminazione del record.

Prerequisiti

Se non hai ancora aggiunto il trigger AccountDeletion, segui questi passaggi.

  1. Nella Developer Console, fai clic su File | New (Nuovo) | Apex Trigger (Trigger Apex).
  2. Inserisci AccountDeletion come nome del trigger, quindi seleziona Account come sObject. Fai clic su Submit (Invia).
  3. Sostituisci il codice predefinito con il seguente.
    trigger AccountDeletion on Account (before delete) {
      // Prevent the deletion of accounts if they have related opportunities.
      for(Account a : [SELECT Id FROM Account
        WHERE Id IN (SELECT AccountId FROM Opportunity) AND
        Id IN :Trigger.old]) {
        Trigger.oldMap.get(a.Id).addError('Cannot delete account with related opportunities.');
      }
    }

Se hai aggiunto il trigger AccountDeletion in un'unità precedente ma l'hai disattivato per consentire al sistema di verificare la tua sfida, riattivalo.

  1. In Setup (Imposta), cerca Apex Triggers (Trigger Apex).
  2. Nella pagina Apex Triggers (Trigger Apex), fai clic su Edit (Modifica) in corrispondenza del trigger AccountDeletion.
  3. Seleziona Is Active (È attivo).
  4. Fai clic su Save (Salva).

Se l'organizzazione contiene trigger di un'unità precedente chiamati AddRelatedRecord, CalloutTrigger o HelloWorldTrigger, disattivali. Ad esempio, per disattivare il trigger AddRelatedRecord:

  1. In Setup (Imposta), cerca Apex Triggers (Trigger Apex).
  2. Nella pagina Apex Triggers (Trigger Apex), fai clic su Edit (Modifica) in corrispondenza del trigger AddRelatedRecord.
  3. Deseleziona Is Active (È attivo).
  4. Fai clic su Save (Salva).

Per disabilitare i trigger HelloWorldTrigger e CalloutTrigger, ripeti i passaggi precedenti.

Aggiungere ed eseguire un test di unità

Per prima cosa, iniziamo con l'aggiungere un metodo di test. Questo metodo di test verifica ciò che il trigger è stato progettato per fare (il caso positivo): impedire che un account venga eliminato se contiene opportunità correlate.

  1. Nella Developer Console, fai clic su File | New (Nuovo) | Apex Class (Classe Apex).
  2. Inserisci TestAccountDeletion come nome della classe, quindi fai clic su OK.
  3. Sostituisci il corpo predefinito della classe con il codice seguente.
    @isTest
    private class TestAccountDeletion {
      @isTest
      static void TestDeleteAccountWithOneOpportunity() {
        // Test data setup
        // Create an account with an opportunity, and then try to delete it
        Account acct = new Account(Name='Test Account');
        insert acct;
        Opportunity opp = new Opportunity(
          Name=acct.Name + ' Opportunity',
          StageName='Prospecting',
          CloseDate=System.today().addMonths(1),
          AccountId=acct.Id);
        insert opp;
        // Perform test
        Test.startTest();
          Database.DeleteResult result = Database.delete(acct, false);
        Test.stopTest();
        // Verify
        // In this case the deletion should have been stopped by the trigger,
        // so verify that we got back an error.
        System.assert(!result.isSuccess());
        System.assert(result.getErrors().size() > 0);
        System.assertEquals('Cannot delete account with related opportunities.',
          result.getErrors()[0].getMessage());
      }
    }
    Il metodo di test imposta innanzitutto un account di test contenente un'opportunità. Quindi, elimina l'account di test, attivando così il trigger AccountDeletion. Il metodo di test verifica che il trigger abbia impedito l'eliminazione dell'account di test, controllando il valore restituito dalla chiamata Database.delete(). Il valore restituito è un oggetto Database.DeleteResult che contiene informazioni sull'operazione di eliminazione. Il metodo di test verifica che l'eliminazione non sia andata a buon fine e verifica il messaggio di errore ricevuto.
  4. Per eseguire questo test, fai clic su Test | New Run (Nuova esecuzione).
  5. In Test Classes (Classi di test), fai clic su TestAccountDeletion.
  6. Per aggiungere all'esecuzione del test tutti i metodi della classe TestAccountDeletion, fai clic su Add Selected (Aggiungi selezionate).
  7. Fai clic su Run (Esegui). Individua il risultato del test nella scheda Tests (Test) sotto all'ultima esecuzione.

La classe di test TestAccountDeletion contiene un solo metodo di test, che verifica un singolo record account. Inoltre, questo test è per il caso positivo. Fai sempre dei test su più scenari per assicurarti che il trigger funzioni in tutti i casi, ivi compresa l'eliminazione di un account senza opportunità e le eliminazioni di account in blocco.

I dati di test vengono impostati all'interno del metodo di test, il che può richiedere molto tempo se si aggiungono altri metodi di test. Se hai molti metodi di test, inserisci la creazione dei dati di test in una classe di utilità per l'esecuzione di test e chiama quella classe da più metodi di test. La prossima unità illustra come sfruttare una classe di utilità per l'esecuzione di test e come aggiungere altri metodi di test.

Ulteriori informazioni

Il metodo di test contiene la coppia di metodi Test.startTest() e Test.stopTest(), che delimitano un blocco di codice il cui scopo è ottenere un nuovo insieme di limiti del governor. In questo test, l'impostazione dei dati di test utilizza due istruzioni DML prima dell'esecuzione del test. Per verificare che il codice Apex venga eseguito entro i limiti del governor, occorre isolare l'utilizzo dei limiti relativi all'impostazione dei dati da quelli del test. Per isolare l'utilizzo dei limiti da parte del processo di impostazione dei dati, è necessario racchiudere la chiamata di test all'interno del blocco Test.startTest() e Test.stopTest(). Questo blocco di test va utilizzato anche per testare Apex asincrono. Per ulteriori informazioni, vedi Using Limits, startTest, and stopTest (Utilizzo dei limiti, startTest e stopTest).

Nota

Un problema noto della Developer Console impedisce di aggiornare correttamente la copertura del codice quando si esegue un sottoinsieme di test. Per aggiornare i risultati della copertura del codice, bisogna utilizzare Test | Run All (Esegui tutto) anziché Test | New Run (Nuova esecuzione).

Risorse

Prepararsi per la sfida pratica

Per completare la sfida pratica per questa unità dovrai creare un trigger Apex denominato RestrictContactByName per l'oggetto Contact (Referente) copiando il codice riportato di seguito:

trigger RestrictContactByName on Contact (before insert, before update) {

  //check contacts prior to insert or update for invalid data

  for(Contact c : Trigger.New) {

    if(c.LastName == 'INVALIDNAME') {

      //invalidname is invalid

      c.AddError('The Last Name "'+c.LastName+'" is not allowed for DML');

    }

  }

}
Condividi il tuo feedback su Trailhead dalla Guida di Salesforce.

Conoscere la tua esperienza su Trailhead è importante per noi. Ora puoi accedere al modulo per l'invio di feedback in qualsiasi momento dal sito della Guida di Salesforce.

Scopri di più Continua a condividere il tuo feedback