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.
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.
- Nella Developer Console, fai clic su File | New (Nuovo) | Apex Trigger (Trigger Apex).
- Inserisci
AccountDeletion
come nome del trigger, quindi seleziona Account come sObject. Fai clic su Submit (Invia). - 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.
- In Setup (Imposta), cerca
Apex Triggers
(Trigger Apex). - Nella pagina Apex Triggers (Trigger Apex), fai clic su Edit (Modifica) in corrispondenza del trigger
AccountDeletion
. - Seleziona Is Active (È attivo).
- 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
:
- In Setup (Imposta), cerca
Apex Triggers
(Trigger Apex). - Nella pagina Apex Triggers (Trigger Apex), fai clic su Edit (Modifica) in corrispondenza del trigger
AddRelatedRecord
. - Deseleziona Is Active (È attivo).
- 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.
- Nella Developer Console, fai clic su File | New (Nuovo) | Apex Class (Classe Apex).
- Inserisci
TestAccountDeletion
come nome della classe, quindi fai clic su OK. - Sostituisci il corpo predefinito della classe con il codice seguente.Il metodo di test imposta innanzitutto un account di test contenente un'opportunità. Quindi, elimina l'account di test, attivando così il trigger
@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()); } }
AccountDeletion
. Il metodo di test verifica che il trigger abbia impedito l'eliminazione dell'account di test, controllando il valore restituito dalla chiamataDatabase.delete()
. Il valore restituito è un oggettoDatabase.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. - Per eseguire questo test, fai clic su Test | New Run (Nuova esecuzione).
- In Test Classes (Classi di test), fai clic su TestAccountDeletion.
- Per aggiungere all'esecuzione del test tutti i metodi della classe
TestAccountDeletion
, fai clic su Add Selected (Aggiungi selezionate). - 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).
Risorse
- Apex Developer Guide: Understanding Testing in Apex (Guida per gli sviluppatori Apex: Comprendere il testing in Apex)
- Apex Developer Guide: Triggers (Guida per gli sviluppatori Apex: Trigger)
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'); } } }