Apex トリガのテスト
Apex トリガのテスト
「Apex トリガの記述」単元で取り上げたトリガをテストしましょう。取引先レコードに商談が関連付けられている場合、AccountDeletion トリガはレコードが削除されるのを防ぎます。
前提条件
- まだ AccountDeletion トリガを追加していない場合は、次の手順に従います。
- 開発者コンソールで、 をクリックします。
- トリガ名に「AccountDeletion」と入力して、sObject に [Account (取引先)] を選択します。[Submit (登録)] をクリックします。
- デフォルトのコードを次のコードに置き換えます。
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.'); } }
- 前の単元で AccountDeletion トリガを追加し、システムで問題をチェックできるように無効化してある場合は、再び有効にします。
- [設定] から 「Apex トリガ」を検索します。
- [Apex トリガ] ページで、AccountDeletion トリガの横にある [編集] をクリックします。
- [有効] を選択します。
- [保存] をクリックします。
- 前の単元で取り上げた AddRelatedRecord、CalloutTrigger、または HelloWorldTrigger というトリガが組織にある場合は、無効にします。たとえば、AddRelatedRecord トリガを無効にする手順は、次のとおりです。
- [設定] から 「Apex トリガ」を検索します。
- [Apex トリガ] ページで、AddRelatedRecord トリガの横にある [編集] をクリックします。
- [有効] をオフにします。
- [保存] をクリックします。
- HelloWorldTrigger および CalloutTrigger トリガを無効にするには、上記の手順を繰り返します。
単体テストの追加および実行
最初に、テストメソッドを追加してみましょう。このテストメソッドでは、トリガが設計された目的 (ポジティブケース) を検証します。つまり、取引先に商談が関連付けられている場合はその取引先が削除されないようにします。
- 開発者コンソールで、 をクリックします。
- クラス名として「TestAccountDeletion」と入力し、[OK] をクリックします。
- デフォルトのクラス本文を次のコードで置き換えます。
@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 トリガが実行されます。テストメソッドで、Database.delete() コールの戻り値をチェックして、トリガによってテスト取引先の削除が防止されたことを確認します。戻り値の Database.DeleteResult オブジェクトには、削除操作に関する情報が含まれます。テストメソッドで、削除が行われなかったことと、エラーメッセージが取得されたことを確認します。
- このテストを実行するには、 をクリックします。
- [Test Classes (テストクラス)] の下で、[TestAccountDeletion] をクリックします。
- TestAccountDeletion クラスのすべてのメソッドをテスト実行に追加するには、[Add Selected (選択項目を追加)] をクリックします。
-
[Run (実行)] をクリックします。
[Tests (テスト)] タブの最新の実行で、テスト結果を見つけます。
TestAccountDeletion テストクラスには、1 つの取引先レコードをテストする 1 つのテストメソッドのみが含まれます。また、このテストはポジティブケースが対象です。商談のない取引先の削除や取引先の一括削除など、必ず他のシナリオもテストして、すべてのケースでトリガが機能することを確認します。
テストデータはテストメソッド内部に設定されるため、さらにテストメソッドを追加していくと、設定に時間がかかる場合があります。多くのテストメソッドがある場合は、テストデータの作成をテストユーティリティクラスに入れて、複数のテストメソッドからそのユーティリティクラスをコールします。次の単元では、テストユーティリティクラスを利用して、さらにいくつかのテストメソッドを追加する方法ついて説明します。
もうひとこと...
テストメソッドには、Test.startTest() および Test.stopTest() メソッドのペアが含まれます。このペアによって、ガバナ制限の最新セットを取得するコードのブロックが区切られます。このテストでは、テストを実行する前に、テストデータの設定に 2 つの DML ステートメントが使用されます。その Apex コードがガバナ制限内で実行されることをテストするには、データ設定の使用制限をテストの使用制限と切り離す必要があります。データ設定プロセスの使用制限を切り離すには、テストコールを Test.startTest() と Test.stopTest() のブロックで囲みます。このテストブロックは、非同期 Apex をテストする場合にも使用します。詳細は、「Limits、startTest、および stopTest の使用」を参照してください。