Skip to main content
3 月 5 日~ 6 日にサンフランシスコで開催される TDX (Salesforce+ でも配信) で「Developer Conference for the AI Agent Era (AI エージェント時代に向けた開発者向けカンファレンス)」にぜひご参加ください。お申し込みはこちら

予想時間

トピック

コミュニティに質問

権限ベースのテストを記述する

学習の目的

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

  • 権限ベースのテストの重要性を説明する。
  • 権限ベースの単体テストを記述する。
メモ

メモ

日本語で受講されている方へ
Challenge は日本語の Trailhead Playground で開始し、かっこ内の翻訳を参照しながら進めていってください。Challenge での評価は英語データを対象に行われるため、英語の値のみをコピーして貼り付けるようにしてください。日本語の組織で Challenge が不合格だった場合は、(1) この手順に従って [Locale (地域)] を [United States (米国)] に切り替え、(2) [Language (言語)] を [English (英語)] に切り替えてから、(3) [Check Challenge (Challenge を確認)] ボタンをクリックしてみることをお勧めします。

翻訳版 Trailhead を活用する方法の詳細は、自分の言語の Trailhead バッジを参照してください。

パターン

開発者の多くは、コードの権限テストを記述すべきと考えています。次の動画で、権限ベースの単体テストの概要をご覧ください。

権限ベースのテストは、テストの中でもパターンが一番複雑になる可能性があります。その理由の 1 つは、権限が混乱を招きやすいことです。もう 1 つの理由は、適切な一連の権限テストで、ポジティブとネガティブの両方のテストパターンが使用されることです。権限テストを記述するには、テストデータだけでなく、1 人以上のテストユーザーを生成する必要があります。この両方を作成したら、ポジティブとネガティブの両方のテストを記述して、特定の権限があるテストユーザー、または権限がないテストユーザーとして実行できます。 

では、権限テストのパターンを見てみましょう。

  1. テストデータを生成するか読み込みます。
  2. 適切な権限セットがあるユーザーを作成します。
  3. System.runAs(user) ブロックを開始します。
  4. 単元 3 と 4 で見てきたように、System.runAs(user) ブロック内でネガティブテストまたはポジティブテストを実行します。

権限セットテストは唯一、独自のテストデータを作成する必要がありません。権限セットとは、付与されている権限の詳細を記したレコードです。これらの権限セットレコードは、実質的にメタデータで、データではありません。権限セットは組織設定の一部であるため、テスト時に既存の権限セットを使用します。したがって、このテストでは、テストユーザーを作成し、そのユーザーに既存の権限セットを割り当てるだけで済みます。 

このモジュールの単元 1 でインストールしたパッケージに、Private_Object_Access という権限セットと、組織の共有設定が非公開に設定されているカスタムオブジェクトが付属します。この 2 つを利用した権限セットテストがどのようになるか見てみましょう。 

  1. VS Code を開きます。
  2. [Explorer (エクスプローラー)] サイドバーで、classes フォルダーを右クリックし、[SFDX: Create Apex Class (SFDX: Apex クラスを作成)] を選択します。
  3. 新しいクラスに PermissionsTests と名前を付け、デフォルトのディレクトリを受け入れます。
  4. クラスの内容を次のコードに置き換えます。
    @IsTest
    private class PermissionsTests {
      @TestSetup
      static void testSetup() {
        // GIVEN
        Account a = TestFactory.getAccount('No view For You!', true);
        Private_Object__c po = new Private_Object__c(Account__c = a.id, Notes__c = 'foo');
        insert po;
      }
      @IsTest
      static void testNegativePermissionSet() {
        // GIVEN
        User u = new User(
          ProfileId = [SELECT Id FROM Profile WHERE Name = 'Standard User'].Id,
          LastName = 'last',
          Email = 'Cpt.Awesome@awesomesauce.com',
          UserName = 'Cpt.Awesome.' + DateTime.now().getTime() + '@awesomesauce.com',
          Alias = 'alias',
          TimeZoneSidKey = 'America/Los_Angeles',
          EmailEncodingKey = 'UTF-8',
          LanguageLocaleKey = 'en_US',
          LocaleSidKey = 'en_US'
        );
        insert u;
        System.runAs(u) {
          // WHEN
          Test.startTest();
            Private_Object__c[] pos = [SELECT Id, Account__c, Notes__c FROM Private_Object__c];
          Test.stopTest();
          // THEN
          Assert.areEqual(
            0,
            pos.size(),
            'A user without the permission set shouldn\'t see any records');
        }
      }
    }
  5. [File (ファイル)] > [Save (保存)] をクリックします。
  6. 作業中のファイルを右クリックして、[SFDX: Deploy Source To Org (SFDX: 組織にソースをリリース)] を選択します。
  7. testNegativePermissionSet メソッドに表示される [Run Test (テストを実行)] ボタンをクリックします。

コードのポイント

上記のコードのテストメソッドで、権限セットがないユーザーは Private_Object__c レコードを表示できないことが示されます。

この例の @TestSetup メソッドは、取引先に関連付けられた Private_Object__c レコードを作成します。共有モデルが非公開に設定されているため、このレコードを表示できるのはシステムのみです。実際のテストメソッドを実行すると、新しいユーザーが作成され、そのユーザーとしてクエリが実行されます。その結果、新しいユーザーが Private_Object__c レコードを表示できなくなります。 

ハンズオン Challenge

+500 ポイント

準備を始めましょう

この 単元 は各自のハンズオン組織で実行します。[起動] をクリックして開始するか、組織の名前をクリックして別の組織を選びます。

あなたの Challenge

Create a permission-based test
The Private_Object_Access permission set includes the view all permission for Private_Object__c records. Write a positive permission test demonstrating that users with the Private_Object_Access permission set can view Private_Object__c records that they don’t own.
  • Create a new method on the PermissionsTests class called testPositivePermissionSet.
  • The test should check that users with the Private_Object_Access permission set can access Private_Object__c records that they do not own. Both metadata are part of the package installed in Unit 1.
  • Execute your unit test and ensure that it passes.
  • Hint: you assign a permission set in Apex in the following way:

        PermissionSet ps = [
          SELECT Id
          FROM PermissionSet
          WHERE Name = 'Permission_Set_Name'
        ];
        insert new PermissionSetAssignment(
          AssigneeId = u.id,
          PermissionSetId = ps.Id
        );
    
Salesforce ヘルプで Trailhead のフィードバックを共有してください。

Trailhead についての感想をお聞かせください。[Salesforce ヘルプ] サイトから新しいフィードバックフォームにいつでもアクセスできるようになりました。

詳細はこちら フィードバックの共有に進む