この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

レッスン 2: テストメソッドの追加

テストに使用するデータを作成するためのユーティリティクラスを追加してテストメソッドからコールできるようになりました。次はテストメソッドが含まれるクラスを作成しましょう。テストクラスとテストメソッドを追加する手順は、次のとおりです。

  1. [Repository (リポジトリ)] タブの [Setup Entity Type (設定エンティティ種別)] セクションで、[Classes (クラス)] をクリックし、[New (新規)] をクリックします。
  2. クラス名として「TestInvoiceStatementDeletion」と入力し、[OK] をクリックします。
  3. 自動生成されたコードを削除し、次のコードを追加します。
    1swfobject.registerObject("clippy.codeblock-0", "9");@isTest
    2private class TestInvoiceStatementDeletion {
    3
    4    static testmethod void TestDeleteInvoiceWithLineItem() {
    5        // Create an invoice statement with a line item then try to delete it
    6        Invoice_Statement__c inv = TestDataFactory.createOneInvoiceStatement(true);
    7        Test.startTest();
    8        Database.DeleteResult result = Database.delete(inv, false);
    9        Test.stopTest();
    10
    11        // Verify invoice with a line item didn't get deleted. 
    12        System.assert(!result.isSuccess());
    13    }
    14
    15    static testmethod void TestDeleteInvoiceWithoutLineItems() {
    16        // Create an invoice statement without a line item and try to delete it
    17        Invoice_Statement__c inv = TestDataFactory.createOneInvoiceStatement(false);
    18        Test.startTest();
    19        Database.DeleteResult result = Database.delete(inv, false);
    20        Test.stopTest();
    21
    22        // Verify invoice without line items got deleted. 
    23        System.assert(result.isSuccess());
    24    }
    25
    26    static testmethod void TestBulkDeleteInvoices() {
    27        // Create two invoice statements, one with and one with out line items
    28        // Then try to delete them both in a bulk operation, as might happen
    29        // when a trigger fires.
    30        List<Invoice_Statement__c> invList = new List<Invoice_Statement__c>();
    31        invList.add(TestDataFactory.createOneInvoiceStatement(true));
    32        invList.add(TestDataFactory.createOneInvoiceStatement(false));
    33        Test.startTest();
    34        Database.DeleteResult[] results = Database.delete(invList, false);
    35        Test.stopTest();
    36
    37        // Verify the invoice with the line item didn't get deleted
    38        System.assert(!results[0].isSuccess());
    39
    40        // Verity the invoice without line items did get deleted.
    41        System.assert(results[1].isSuccess());
    42    }
    43}
    44
  4. [Save (保存)] をクリックします。

もうひとこと...

  • このクラスは、@isTest アノテーションを使用して定義されています。このアノテーションは、前のレッスンの共通テストユーティリティクラスの定義でも使用されていました。このレッスンでは、このアノテーションを使用してクラスをテストクラスとしてマークし、Apex が実行できるテストメソッドを含めることができるようにします。このアノテーションを使用せずに Apex クラス内にテストメソッドと他のコードを混在させることもできますが、このアノテーションを使用することをお勧めします。
  • クラスには 3 つのテストメソッドが含まれます。テストメソッドは、引数を取らない静的な最上位レベルのメソッドです。テストメソッドは、testmethod キーワードまたは @isTest アノテーションを使用して定義されます。次のどちらの宣言形式も有効です。
    testmethod キーワードを使用したテストメソッドの宣言:
    1static testmethod void myTest() {
    2    // Add test logic
    3}
    @isTest アノテーションを使用したテストメソッドの宣言:
    1static @isTest void myTest() {
    2    // Add test logic
    3}
  • 次に、このクラス内の各テストメソッドについて説明します。
    • TestDeleteInvoiceWithLineItem: このテストメソッドは、トリガが本来の機能を実行しているかどうか、つ���り、品目名を含む請求書明細が削除されないようにしているかどうかを確認します。テストファクトリメソッドを使用して品目名を含む請求書明細を作成し、Database.delete Apex メソッドを使用して請求書を削除します。このメソッドが返す Database.DeleteResult オブジェクトは、操作が正常に終了したかどうかを判定し、エラーのリストを取得するために使用できます。テストは isSuccess メソッドをコールして、false が返される (請求書が削除されていない) ことを確認します。
    • TestDeleteInvoiceWithoutLineItems: このテストメソッドは、トリガが品目名を含まない請求書明細の削除を阻止しないことを確認します。このテストメソッドは、品目名を含まない請求書明細を挿入してからその請求書明細を削除します。前のメソッドと同様、テストファクトリメソッドをコールしてテストデータを作成してから、delete 操作を行う Database.delete をコールします。このテストは、Database.DeleteResultisSuccess メソッドが true を返すことを確認します。
    • TestDeleteInvoiceWithoutLineItems: この 3 つ目のテストメソッドは、請求書のリストを一括削除します。このテストメソッドは、2 つの請求書明細を含むリストを作成します。最初の請求書明細には 1 つの品目名があり、2 つ目の請求書明細には品目名がありません。削除する請求書明細のリストを渡して Database.delete をコールします。今回は、第 2 パラメータがあります。これは省略可能な Boolean パラメータで、一部の sObject の削除が失敗した場合にすべての sObject に対する delete 操作をロールバックする必要があるかどうかを示します。渡した値は false であるため、失敗した sObject があっても delete DML 操作全体をロールバックするのではなく、エラーが発生しなかった sObject は削除されます。この場合、テストは Database.DeleteResultisSuccess メソッドをコールして、最初の請求書明細が削除されず、2 つ目の請求書明細が削除されたことを確認します。
  • 各テストメソッドは Test.startTest/Test.stopTest ブロック内で delete DML 操作を実行します。各テストメソッドには、このようなブロックを 1 つのみ作成できます。このブロック内で実行されるすべてのコードには、テストの他のコードとは別に、新しいガバナ制限のセットが割り当てられます。これにより、テスト内の他の設定コードと同じ制限を共有しなくなるため、ガバナ制限をテストできます。このテストでは、一度に削除するレコードは 1 件か 2 件で、制限に達することはないためガバナ制限のテストは重要では��りませんが、実際のテストステートメントは Test.startTest/Test.stopTest で囲むことをお勧めします。Test.startTest をコールする前に、前提条件の設定とテストデータ作成を実行し、Test.stopTest の後に検証を含めることができます。Test.stopTest をコールした後に、元のガバナ制限が再び適用されます。