Skip to main content

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
Remarque

Remarque

Vous souhaitez apprendre en français ? Dans ce badge, les validations de défi pratique Trailhead se font en anglais. Les traductions sont fournies entre parenthèses à titre de référence. Veillez à copier/coller les valeurs en anglais, puis à définir la langue de votre Trailhead Playground sur Anglais et les paramètres régionaux sur États-Unis. Suivez les instructions ici.

Consultez le badge Trailhead dans votre langue pour découvrir comment profiter de l’expérience Trailhead traduite.

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 :

  1. Dans la Developer Console, cliquez sur Fichier (File) | New (Nouveau) | Apex Trigger (Déclencheur Apex).
  2. Saisissez le nom de déclencheur AccountDeletion, puis sélectionnez le sObject Account (Compte). Cliquez sur Submit (Soumettre).
  3. 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.

  1. Dans Setup (Configuration), recherchez Apex Triggers (Déclencheurs Apex).
  2. Dans la page Apex Triggers (Déclencheurs Apex), cliquez sur Edit (Modifier) en regard du déclencheur AccountDeletion.
  3. Sélectionnez Is Active (Actif).
  4. 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 :

  1. Dans Setup (Configuration), recherchez Apex Triggers (Déclencheurs Apex).
  2. Dans la page Apex Triggers (Déclencheurs Apex), cliquez sur Edit (Modifier) en regard du déclencheur AddRelatedRecord.
  3. Désélectionnez Is Active (Actif).
  4. 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.

  1. Dans la Developer Console, cliquez sur File (Fichier) | New (Nouveau) | Apex Class (Classe Apex).
  2. Saisissez le nom de classe TestAccountDeletion, puis cliquez sur OK (OK).
  3. Remplacez le corps de classe par défaut par ce qui suit :
    @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());
      }
    }
    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 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’appel Database.delete(). La valeur renvoyée est un objet Database.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.
  4. Pour exécuter ce test, cliquez sur Test (Tester) | New Run (Nouvelle exécution).
  5. Sous Test Classes (Classes de test), cliquez sur TestAccountDeletion.
  6. Pour ajouter toutes les méthodes de la classe TestAccountDeletion à l’exécution du test, cliquez sur Add Selected (Ajouter sélection).
  7. 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.

Remarque

Un problème connu dans la Developer Console empêche la mise à jour de la couverture de code lors de l'exécution d'un sous-ensemble de tests. Pour mettre à jour vos résultats de couverture de code, utilisez Test | Run All (Tout exécuter) plutôt que Test | New Run (Nouvelle exécution).

Ressources

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');

    }

  }

}
Formez-vous gratuitement !
Créez un compte pour continuer.
Qu’est-ce que vous y gagnez ?
  • Obtenez des recommandations personnalisées pour vos objectifs de carrière
  • Mettez en pratique vos compétences grâce à des défis pratiques et à des questionnaires
  • Suivez et partagez vos progrès avec des employeurs
  • Découvrez des opportunités de mentorat et de carrière