Test de déclencheurs Apex
Objectifs de formation
Une fois cette unité terminée, vous pourrez :
- Écrire un test pour un déclencheur qui s'active sur une opération d'enregistrement unique
- Exécuter toutes les méthodes de test dans une classe
Test de déclencheurs Apex
Avant de déployer un déclencheur, écrivez des tests unitaires pour exécuter les actions qui déclenchent et vérifient les résultats attendus.
Testons un déclencheur que nous avons utilisé dans le module Déclencheurs Apex. Si un enregistrement de compte inclut des opportunités associées, le déclencheur AccountDeletion
empêche la suppression de l'enregistrement.
Prérequis
Si vous n’avez pas encore ajouté le déclencheur AccountDeletion
, procédez comme suit :
- Dans la Developer Console, cliquez sur Fichier (File) | New (Nouveau) | Apex Trigger (Déclencheur Apex).
- Saisissez le nom de déclencheur
AccountDeletion
, puis sélectionnez le sObject Account (Compte). Cliquez sur Submit (Soumettre). - Remplacez le code par défaut par :
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.'); } }
Si vous avez ajouté le déclencheur AccountDeletion
dans une unité précédente, mais en le désactivant pour permettre au système de vérifier votre question d’authentification, réactivez-le.
- Dans Setup (Configuration), recherchez
Apex Triggers
(Déclencheurs Apex). - Dans la page Apex Triggers (Déclencheurs Apex), cliquez sur Edit (Modifier) en regard du déclencheur
AccountDeletion
. - Sélectionnez Is Active (Actif).
- Cliquez sur Save (Enregistrer).
Si votre organisation contient des déclencheurs d'une unité précédente appelés AddRelatedRecord
, CalloutTrigger
ou HelloWorldTrigger
, désactivez-les. Par exemple, pour désactiver le déclencheur AddRelatedRecord
, procédez comme suit :
- Dans Setup (Configuration), recherchez
Apex Triggers
(Déclencheurs Apex). - Dans la page Apex Triggers (Déclencheurs Apex), cliquez sur Edit (Modifier) en regard du déclencheur
AddRelatedRecord
. - Désélectionnez Is Active (Actif).
- Cliquez sur Save (Enregistrer).
Pour désactiver les déclencheurs HelloWorldTrigger
et CalloutTrigger
, répétez les étapes précédentes.
Ajout et exécution d’un test unitaire
Commençons par ajouter une méthode de test. Cette méthode de test vérifie le rôle du déclencheur (le cas positif), qui consiste à empêcher la suppression d'un compte s'il a des opportunités associées.
- Dans la Developer Console, cliquez sur File (Fichier) | New (Nouveau) | Apex Class (Classe Apex).
- Saisissez le nom de classe
TestAccountDeletion
, puis cliquez sur OK (OK). - Remplacez le corps de classe par défaut par ce qui suit :La méthode de test configure d'abord un compte test avec une opportunité. Elle supprime ensuite le compte test, ce qui active le déclencheur
@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
. La méthode de test vérifie que le déclencheur a empêché la suppression du compte test en contrôlant la valeur renvoyée de l’appelDatabase.delete()
. La valeur renvoyée est un objetDatabase.DeleteResult
contenant des informations sur l’opération de suppression. La méthode de test vérifie que la suppression n'a pas réussi et examine le message d'erreur obtenu. - Pour exécuter ce test, cliquez sur Test (Tester) | New Run (Nouvelle exécution).
- Sous Test Classes (Classes de test), cliquez sur TestAccountDeletion.
- Pour ajouter toutes les méthodes de la classe
TestAccountDeletion
à l’exécution du test, cliquez sur Add Selected (Ajouter sélection). - Cliquez sur Run (Exécuter). Recherchez les résultats de test sous l'onglet Tests de la dernière exécution.
La classe de test TestAccountDeletion
contient une seule méthode de test, qui teste un enregistrement de compte unique. Ce test s'applique en outre au cas positif. Testez toujours quelques scénarios pour vous assurer que le déclencheur fonctionne dans tous les cas, notamment lors de la suppression d'un compte sans opportunité et de suppressions de compte en masse.
Les données test sont configurées dans la méthode de test, ce qui peut être long lorsque vous ajoutez des méthodes de test. Si vous avez de nombreuses méthodes de test, placez la création des données test dans une classe utilitaire de test, puis appelez la classe à partir de plusieurs méthodes de test. L'unité suivante présente comment exploiter une classe utilitaire de test et ajouter d'autres méthodes de test.
En savoir plus
La méthode de test contient la paire de méthodes Test.startTest()
et Test.stopTest()
. Elle délimite un bloc de code qui obtient un nouvel ensemble de limitations du gouverneur. Dans ce test, la configuration des données test utilise deux instructions DML avant l'exécution du test. Pour vérifier que le code Apex est exécuté dans les limites du gouverneur, isolez l'utilisation de la limite de la configuration des données de votre test. Placez pour cela l'appel test dans le bloc Test.startTest()
et Test.stopTest()
. Utilisez également ce bloc pour tester un code Apex asynchrone. Pour plus d’informations, reportez-vous à Utilisation de limites, de startTest et de stopTest.
Ressources
- Guide du développeur Apex : Compréhension des tests dans Apex
- Guide du développeur Apex : Déclencheurs
Préparation au défi pratique
Afin de relever le défi pratique de cette unité, vous devrez créer un déclencheur Apex nommé RestrictContactByName
sur l’objet Contact (Contact) à l’aide du code ci-dessous :
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'); } } }