投稿者:Tetsuo Ajima | 投稿日:2013年7月25日(木) 02:10


みなさんはApexテストコードを書く際にSystem.runAs()を使っていますか?System.runAs()を使うと、指定したユーザの権限でテストを実行でき、ユーザ権限別のテストを行うことができます。
Developerforce Wikiの"Apexコードテストメソッドの概要" ページにも "runAs メソッドを使用して複数のユーザコンテキストでアプリケーションをテストする" とあり、System.runAs()を使って各種ユーザの権限をテストすることが推奨されています。

User u = new User();
u.Email = ...;
u.FirstName = ...;
u.LastName = ...;
u.alias = ...;
u.username = ...;
u.profileid = ...;
u.emailencodingkey = ...;
u.languagelocalekey = ...;
u.localesidkey = ...;
u.timezonesidkey = ...;

System.runAs(u) {
    // このブロック内はユーザ u の権限で実行される
}


ここで注意しなければならないのは、以下の点です。


ユーザ名に注意

Salesforceユーザ名は他のお客様組織を含めてユニークでなければなりません。(作成したユーザーをレコードのオーナーにしたり、あるグループに追加したりしたい場合等、)ユーザをinsertする必要がある場合は@より前の文字列に現在日時を含めたり、@より後ろのドメイン名を工夫したりして、できるだけ他の組織・他のユーザと重複しない文字列を使う配慮が必要です。


必須入力項目は満たされているか?

UserオブジェクトのレコードはEmail, FirstName, alias, profileid, emailencodingkey, languagelocalekey, localesidkey, timezonesidkey等の項目が必須です。これらの項目にすべて値を設定する必要があります。


ライセンス数は足りているか?

作成したユーザレコードをinsertする場合、指定したユーザのプロファイルに対応したライセンスが足りないとユーザの作成に失敗し、実行時エラーになります。購入ライセンス数が利用するユーザ数ぎりぎりである場合などには注意が必要です。


トリガ・ワークフロールール・入力規則は動作しません

System.runAs()の呼び出しでは、トリガ・ワークフロールール・入力規則は動作しません。


DML実行数にカウントされます

System.runAs()はDMLの実行回数に含まれます。


既存のユーザレコードを利用する

という手もあります。SOQLクエリを使ってUserオブジェクトから利用したいユーザのプロファイル等をキーにしてレコードを取得して使えば、必須入力項目やユーザ名、およびライセンス数の問題は回避できます。