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
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.
- Klicken Sie in der Developer Console auf File (Datei) | New (Neu) | Apex Trigger (Apex-Auslöser).
- Geben Sie als Auslösernamen
AccountDeletion
ein und wählen Sie dann Account für das sObject aus. Klicken Sie auf Submit (Senden). - 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.
- Suchen Sie im Setup nach
Apex Triggers
(Apex-Auslöser). - Klicken Sie auf der Seite "Apex Triggers (Apex-Auslöser)" neben dem Auslöser
AccountDeletion
auf Edit (Bearbeiten). - Wählen Sie die Option Is Active (Ist aktiv) aus.
- 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
:
- Suchen Sie im Setup nach
Apex Triggers
(Apex-Auslöser). - Klicken Sie auf der Seite "Apex Triggers (Apex-Auslöser)" neben dem Auslöser
AddRelatedRecord
auf Edit (Bearbeiten). - Deaktivieren Sie die Option Is Active (Ist aktiv).
- 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.
- Klicken Sie in der Developer Console auf File (Datei) | New (Neu) | Apex Class (Apex-Klasse).
- Geben Sie
TestAccountDeletion
als Klassennamen ein und klicken Sie dann auf OK. - Ersetzen Sie den Standardtext der Klasse durch Folgendes: Die Testmethode richtet zuerst einen Testaccount mit einer Opportunity ein. Als Nächstes löscht sie den Testaccount, wodurch der Auslöser
@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
ausgeführt wird. Die Testmethode prüft, ob der Auslöser das Löschen des Testaccounts verhindert hat, indem sie den Rückgabewert des AufrufsDatabase.delete()
überprüft. Bei dem Rückgabewert handelt es sich um einDatabase.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. - Um diesen Test auszuführen, klicken Sie auf Test | New Run (Neuer Lauf).
- Klicken Sie unter "Test Classes (Testklassen)" auf TestAccountDeletion.
- Um alle Methoden in der
TestAccountDeletion
-Klasse zur Testausführung hinzuzufügen, klicken Sie auf Add Selected (Ausgewählte hinzufügen). - 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.
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'); } } }