変更イベントトリガのテスト

学習の目的

この単元を完了すると、次のことができるようになります。

  • Apex 変更イベントトリガの Apex テストクラスを記述する。
  • テストを実行し、Apex 変更イベントトリガのテストカバー率を提示する。

変更イベントトリガのテスト

変更イベントトリガの記述方法を学んだところで、そのトリガのテストを記述してみましょう。トリガをテストすることは推奨されるだけでなく、プラットフォームによって適用されます。Apex トリガをパッケージ化または本番環境にリリースする前に、Apex テストを実施し、十分なコードカバー率を達成する必要があります。 

Apex トリガのテストカバー率を提示するには、1 つ以上のテストメソッドを含む Apex テストクラスを記述します。変更イベントトリガのテストメソッドは次のような構造になります。

@isTest static void testChangeEventTrigger() {
    // Enable all Change Data Capture entities for notifications.
    Test.enableChangeDataCapture();
    // Insert one or more test records
    // ...
    // Deliver test change events
    Test.getEventBus().deliver();
    // Verify the change event trigger’s execution
    // ...
}

テストメソッドに含める 1 つ目のステートメントは次のとおりです。

Test.enableChangeDataCapture();

このステートメントによって、変更データキャプチャのすべてのエンティティが有効になり、テストメソッドの Salesforce レコードの変更によって変更イベントトリガが起動することを確認できます。このメソッドは、すべてのエンティティをテストの目的のみで有効にするもので、組織の変更データキャプチャエンティティの選択には影響ありません。

変更データキャプチャを有効にしたら、何らかの DML 操作を実行して、Test.getEventBus().deliver() メソッドをコールします。このメソッドは、テストイベントバスから対応する変更イベントトリガにイベントメッセージを配信して、トリガを起動させます。

Test.getEventBus().deliver();

テスト変更イベントメッセージは、Salesforce イベントバスとは分離したテストイベントバスに公開されます。これらのメッセージは Salesforce に保持されず、テストクラス外のイベントチャネルにも配信されません。再実行 ID などのテスト変更イベントメッセージのプロパティは、テストのコンテキストでリセットされ、テストイベントメッセージの値のみが反映されます。

トリガのテストの作成と実行

ではここで、TestEmployeeChangeTrigger というテストクラスを実際に作成してみましょう。クラスのテストメソッドは、Employee (従業員) テストレコードを作成して、そのレコードを更新します。これらの操作ごとに、Employee (従業員) 変更イベントのトリガが起動します。このテストでは、トリガが作成した ToDo をクエリして ToDo 数を検証する方法でトリガの実行を確認します。

テストクラスを開発者コンソールで実行すると、[Logs (ログ)] タブにデバッグログが表示されます。Apex テストの場合は、自動プロセスエンティティの [設定] でデバッグログを設定する必要がありません。

テストクラスを作成する手順は、次のとおりです。

  1. 開発者コンソールで、[File (ファイル)] | [New (新規)] | [Apex Class (Apex クラス)] を選択します。
  2. [Name (名前)] 項目に、TestEmployeeChangeTrigger というトリガの名前を入力します。
  3. デフォルトのコンテンツを次のコードに置き換えます。
  4. @isTest
    public class TestEmployeeChangeTrigger {
        @isTest static void testCreateAndUpdateEmployee() {
            // Enable all Change Data Capture entities for notifications.
            Test.enableChangeDataCapture();
            // Insert an Employee test record
            insert new Employee__c(Name='e-101',
                First_Name__c='Astro',
                Last_Name__c='Test',
                Tenure__c=1);
            // Call deliver to fire the trigger and deliver the test change event.
            Test.getEventBus().deliver();
            // VERIFICATIONS
            // Check that the change event trigger created a task.
            Task[] taskList = [SELECT Id,Subject FROM Task];
            System.assertEquals(1, taskList.size(),
                'The change event trigger did not create the expected task.');
            // Update employee record
            Employee__c[] empRecords = [SELECT Id,OwnerId,First_Name__c,Tenure__c FROM Employee__c];
            // There is only one test record, so get the first one
            Employee__c emp = empRecords[0];
            // Debug
            System.debug('Retrieved employee record: ' + emp);
            // Update one field and empty another
            emp.First_Name__c = 'Codey';
            emp.Tenure__c = null;
            update emp;
            // Call deliver to fire the trigger for the update operation.
            Test.getEventBus().deliver();
            // VERIFICATIONS
           // Check that the change event trigger created a task.
           // We should have two tasks now, including one from the first trigger invocation.
          Task[] taskList2 = [SELECT Id,Subject FROM Task];
          System.assertEquals(2, taskList2.size(),
              'The change event trigger did not create the expected task.');
        }
    }
  5. テストクラスウィンドウで、[Run Test (テストの実行)] をクリックします。テストが終了すると、[Tests (テスト)] タブにテストの実行状況が表示されます。
  6. [Tests (テスト)] タブをクリックして、[Overall Code Coverage (全体のコードカバー率)] ペインを展開します。EmployeeChangeTrigger のコードカバー率は 100% で、これがこのテストの実行結果です。

変更イベントトリガを記述してテストクラスを指定できたため、本番環境にリリースできます。

リソース