Skip to main content

Testen von Apex-Auslösern

Lernziele

Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:

  • Schreiben eines Tests für einen Auslöser, der durch einen einzelnen Datensatzvorgang ausgeführt wird
  • Ausführen aller Testmethoden in einer Klasse
Hinweis

Hinweis

Lernen Sie auf Deutsch? Beginnen Sie die Aufgabe in einem Trailhead Playground in der Sprache Deutsch und verwenden Sie für die Navigation die in Klammern angegebenen Übersetzungen. Kopieren und fügen Sie nur die Angaben in Englisch ein, da zur Überprüfung der Aufgabe Daten in Englisch benötigt werden. Wenn Sie die Aufgabe in Ihrer deutschen Organisation nicht bestehen, empfehlen wir Ihnen folgende Vorgehensweise: (1) Stellen Sie das Gebietsschema auf USA um, (2) legen Sie Englisch als Sprache fest (Anweisungen dazu finden Sie hier) und (3) klicken Sie erneut auf die Schaltfläche "Check Challenge" (Aufgabe überprüfen).

Weitere Details dazu, wie Sie die übersetzte Trailhead-Umgebung optimal nutzen können, finden Sie unter dem Badge "Trailhead in Ihrer Sprache".

Testen von Apex-Auslösern

Bevor Sie einen Auslöser bereitstellen, schreiben Sie Einheitentests, die Aktionen durchführen, durch die der Auslöser ausgeführt wird und die die erwarteten Ergebnisse überprüfen.

Lassen Sie uns einen Auslöser testen, mit dem wir bereits im Modul Apex-Auslöser gearbeitet haben. Wenn ein Accountdatensatz mit Opportunities verknüpft ist, verhindert der Auslöser AccountDeletion, dass der Datensatz gelöscht wird.

Voraussetzungen

Wenn Sie den Auslöser accountDeletion noch nicht hinzugefügt haben, gehen Sie wie folgt vor.

  1. Klicken Sie in der Developer Console auf File (Datei) | New (Neu) | Apex Trigger (Apex-Auslöser).
  2. Geben Sie als Auslösernamen AccountDeletion ein und wählen Sie dann Account für das sObject aus. Klicken Sie auf Submit (Senden).
  3. Ersetzen Sie den Standardcode durch Folgendes:
    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.');
      }
    }

Wenn Sie den Auslöser AccountDeletion in einem vorherigen Abschnitt hinzugefügt, ihn jedoch deaktiviert haben, damit das System Ihre Abfrage prüfen kann, aktivieren Sie ihn wieder.

  1. Suchen Sie im Setup nach Apex Triggers (Apex-Auslöser).
  2. Klicken Sie auf der Seite "Apex Triggers (Apex-Auslöser)" neben dem Auslöser AccountDeletion auf Edit (Bearbeiten).
  3. Wählen Sie die Option Is Active (Ist aktiv) aus.
  4. Klicken Sie auf Speichern.

Wenn Ihre Organisation Auslöser namens AddRelatedRecord, CalloutTrigger oder HelloWorldTrigger aus einem vorherigen Abschnitt enthält, deaktivieren Sie diese. So deaktivieren Sie beispielsweise den Auslöser AddRelatedRecord:

  1. Suchen Sie im Setup nach Apex Triggers (Apex-Auslöser).
  2. Klicken Sie auf der Seite "Apex Triggers (Apex-Auslöser)" neben dem Auslöser AddRelatedRecord auf Edit (Bearbeiten).
  3. Deaktivieren Sie die Option Is Active (Ist aktiv).
  4. Klicken Sie auf Speichern.

Um auch die Auslöser HelloWorldTrigger und CalloutTrigger zu deaktivieren, wiederholen Sie die obigen Schritte.

Hinzufügen und Ausführen eines Einheitentests

Fügen Sie zunächst eine Testmethode hinzu. Diese Testmethode prüft, was der Auslöser tun soll (der Gutfall): verhindern, dass ein Account gelöscht wird, wenn mit ihm Opportunities verknüpft sind.

  1. Klicken Sie in der Developer Console auf File (Datei) | New (Neu) | Apex Class (Apex-Klasse).
  2. Geben Sie TestAccountDeletion als Klassennamen ein und klicken Sie dann auf OK.
  3. Ersetzen Sie den Standardtext der Klasse durch Folgendes:
    @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());
      }
    }
    Die Testmethode richtet zuerst einen Testaccount mit einer Opportunity ein. Als Nächstes löscht sie den Testaccount, wodurch der Auslöser AccountDeletion ausgeführt wird. Die Testmethode prüft, ob der Auslöser das Löschen des Testaccounts verhindert hat, indem sie den Rückgabewert des Aufrufs Database.delete() überprüft. Bei dem Rückgabewert handelt es sich um ein Database.DeleteResult-Objekt, das Informationen über den Löschvorgang enthält. Die Testmethode prüft, dass der Löschvorgang nicht erfolgreich war, und überprüft die abgerufenen Fehlermeldungen.
  4. Um diesen Test auszuführen, klicken Sie auf Test | New Run (Neuer Lauf).
  5. Klicken Sie unter "Test Classes (Testklassen)" auf TestAccountDeletion.
  6. Um alle Methoden in der TestAccountDeletion-Klasse zur Testausführung hinzuzufügen, klicken Sie auf Add Selected (Ausgewählte hinzufügen).
  7. Klicken Sie auf Ausführen. Das Testergebnis wird auf der Registerkarte "Tests" unter dem letzten Lauf angezeigt.

Die Testklasse TestAccountDeletion enthält nur eine Testmethode, die einen einzigen Accountdatensatz testet. Dieser Test ist außerdem für den Gutfall konzipiert. Testen Sie stets noch mehr Szenarien, um sicherzugehen, dass der Auslöser in allen Fällen funktioniert, z. B. beim Löschen eines Accounts ohne Opportunities oder beim Massenlöschen von Accounts.

Testdaten werden innerhalb der Testmethode eingerichtet, was zeitaufwändig sein kann, je mehr Testmethoden Sie hinzufügen. Wenn Sie über viele Testmethoden verfügen, verschieben Sie die Erstellung der Testdaten in eine Test-Dienstprogrammklasse und rufen Sie die Dienstprogrammklasse über mehrere Testmethoden auf. Im nächsten Abschnitt erfahren Sie, wie Sie eine Test-Dienstprogrammklasse nutzen und mehr Testmethoden hinzufügen können.

Weitere Infos

Die Testmethode enthält das Methodenpaar Test.startTest() und Test.stopTest(), das einen Codeblock begrenzt, für den neue Obergrenzen verwendet werden. In diesem Test werden für die Testdateneinrichtung zwei DML-Anweisungen angewendet, bevor der Test durchgeführt wird. Um zu testen, dass Apex-Code innerhalb der geltenden Obergrenzen ausgeführt wird, trennen Sie die Obergrenzenausnutzung der Dateneinrichtung vom Test selbst. Fügen Sie dazu den Testaufruf in den Block zwischen Test.startTest() und Test.stopTest() ein. Verwenden Sie diesen Testblock auch zum Testen von asynchronem Apex. Weitere Informationen finden Sie unter Using Limits, startTest, and stopTest.

Hinweis

Aufgrund eines bekannten Problems mit der Developer Console wird die Codeabdeckung bei Ausführung einer Teilmenge der Tests nicht richtig aktualisiert. Wenn die Ergebnisse für die Codeabdeckung aktualisiert werden sollen, verwenden Sie Test | Run All (Alle ausführen) statt Test | New Run (Neuer Lauf).

Ressourcen

Vorbereiten auf die praktische Aufgabe

Damit Sie die praktische Aufgabe am Ende dieser Lektion absolvieren können, müssen Sie für das Objekt "Contact (Kontakt)" einen Apex-Auslöser namens RestrictContactByName mit dem nachfolgend angegebenen Code erstellen:

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

    }

  }

}
Teilen Sie Ihr Trailhead-Feedback über die Salesforce-Hilfe.

Wir würden uns sehr freuen, von Ihren Erfahrungen mit Trailhead zu hören: Sie können jetzt jederzeit über die Salesforce-Hilfe auf das neue Feedback-Formular zugreifen.

Weitere Infos Weiter zu "Feedback teilen"