Salesforce 認定 Platform デベロッパー 無料問題 9 / 10 ・ 分野4: テスト、デバッグ、リリース
組織には名前が Acme の取引先が 3 件あり、有効なユーザーも何人もいる。次のテストクラスを実行した。クラスにもメソッドにも SeeAllData の指定は無い。 @IsTest private class IsolationTest { @IsTest static void run() { Integer accts = [SELECT COUNT() FROM Account WHERE Name = 'Acme']; Integer users = [SELECT COUNT() FROM User WHERE IsActive = true]; System.debug(accts + ' / ' + (users > 0)); } } デバッグログに出る値として、Apex 開発者ガイドに合うものはどれか。
- 3 / true
- 0 / false
- 0 / true
- 3 / false
正解と解説を見る
正解: C
正解の理由
「Isolation of Test Data from Organization Data in Unit Tests」は、テストメソッドは既定で組織の既存のデータ(標準・カスタムオブジェクトのレコードなど)を見られず、自分が作ったデータだけを見られると書いている。ただし、組織の管理に使うオブジェクトやメタデータのオブジェクトは例外で、例として User・Profile・Organization・RecordType などを挙げている。したがって取引先の件数は 0、有効なユーザーは検索できて true になる。
違う選択肢
「3 / true」… テストは既定で組織の既存のレコードを見られない。Acme の取引先 3 件はテストが作ったものではないので、件数は 0 になる。3 件が見えるのは @IsTest(SeeAllData=true) を付けたときである。
「0 / false」… User は組織の管理に使うオブジェクトとして、隔離の例外に挙がっている。SeeAllData の指定が無くても検索でき、有効なユーザーがいれば件数は 0 より大きい。
「3 / false」… 隔離されるのは取引先のような業務のデータで、User は例外の側である。組み合わせが逆になっている。
押さえどころ
隔離はテストの文脈で動くすべてのコードに及ぶ。テストが起動したトリガーも、テストが見られない組織のデータは見られない。