TrailHead

【Trailhead】実行コンテキストの理解

TrailHead
この記事は約5分で読めます。

Hands-on Challenge

Write an Apex trigger that modifies Account fields before inserting records.Write an Apex trigger that fires before records are inserted and ensures that the ShippingState field has the same value as the BillingState field.

  • Create an Apex class named AccountTriggerHandler that contains a public static method called CreateAccounts to accept the List of Account objects
  • For each Account record, before saving, ensure that the ShippingState field has the same value as the BillingState field
  • Write an Apex trigger named AccountTrigger that fires before records are inserted
  • The Apex trigger must call the AccountTriggerHandler.CreateAccounts() method with the collection of new records
  • Make sure you use the isBefore and isInsert trigger context variables
  • Create a test class named AccountTriggerTest that inserts 200 Account records with a BillingState of CA. After the insert, test to ensure that all 200 records have a ShippingState of CA
  • Before verifying this challenge, run your test class at least once using the Developer Console Run All feature.

日本語訳

レコードを挿入する前に取引先項目を変更するApexトリガーを作成します。レコードが挿入される前に起動し、ShippingState項目がBillingState項目と同じ値を持つようにするApexトリガーを作成します。

  • アカウントオブジェクトのリストを受け入れるための「CreateAccounts」というパブリック静的メソッドを含む「AccountTriggerHandler」という名前のApexクラスを作成します。
  • 各アカウントレコードについて、保存する前に、「ShippingState」フィールドが「BillingState」フィールドと同じ値であることを確認します
  • レコードが挿入される前に起動する「AccountTrigger」という名前のApexトリガーを作成する
  • Apexトリガーは、新しいレコードのコレクションでAccountTriggerHandler.CreateAccounts()メソッドを呼び出す必要があります
  • 必ずisBeforeとisInsertのトリガーコンテキスト変数を使用してください。
  • BillingStateがCAの200個のアカウントレコードを挿入する「AccountTriggerTest」という名前のテストクラスを作成します。挿入後、200のすべてのレコードがCAのShippingStateを持っていることを確認するためにテストします
  • この課題を検証する前に、開発者コンソールのすべて実行機能を使用して、テストクラスを少なくとも1回実行します。

解答

今回はApexクラス(ハンドラクラス)、Trigger、テストクラスを作成し、テストで100%カバーしておく必要があります。

Triggerクラス

trigger AccountTrigger on Account (before insert) {
    
    if ( Trigger.isBefore && Trigger.isInsert ) {
        AccountTriggerHandler.CreateAccounts(Trigger.New);
    }
}

Handlerクラス

public with sharing class AccountTriggerHandler {
    public static void CreateAccounts(List<Account> newAccountList){
        List<Account> updateList = new List<Account>();
        for ( Account rec : newAccountList ) {
            rec.ShippingState = rec.BillingState;
        }
    }
}

Testクラス

@isTest
public class AccountTriggerTest {
    @isTest
    static void Test(){
        List<Account> insertList = new List<Account>();
        for ( Integer i = 0 ; i < 200 ; i++ ) {
            Account insertacc = new Account(
                Name = 'Acc' + i,
                BillingState = 'CA'
            );
            insertList.add(insertacc);
        }
        Test.startTest();
        insert insertList;
        Test.stopTest();
    }
}

忘れずにtestを実行しておきましょう。