テストクラスで、ユーザを指定してテスト実施を行いたい時ってありますよね。
このプロファイルでデータ作成したい!とか、このロールじゃなきゃダメなんだ!とか。
そんな時に有効な「runAsメソッド」を使ってみましたので、軽くご紹介。
runAsメソッドとは
runAsメソッドとは、簡単に言うと、テストクラス内で作成したユーザでテストを実行できるメソッドです。
普段は、システム管理者の自分で実行していたテストも、テストクラス内で新しくユーザを作成することでプロファイルやらメールアドレスやらを自由に設定した状態のユーザでテストを実行できるわけです。
すばらしい。
runAsメソッドの使い方
下のサンプルコードでは、テストクラス内で作成したユーザで、取引先をInsertするテストが書かれています。
テスト実行部分(test.startTest~test.stopTestの間の部分)で、「system.runAs()」が使用されています。
テストを実行したいユーザを引数として渡すことで(ここでは「u」)テストの実行者を指定することができます。
@isTest
private class CreateAccountTest {
@isTest static void test1(){
//ユーザ作成
User u = createUser();
//取引先作成
List<Account> accList = createAcc();
test.startTest();
//作成したユーザで取引先を作成
system.runAs(u){
List<Database.SaveResult> results = database.insert(accList,false);
System.debug('Current User: ' + UserInfo.getUserName());
System.debug('Current Profile: ' + UserInfo.getProfileId());
}
test.stopTest();
}
static User createUser(){
Profile p = [Select Id from Profile Where Name = '営業部長'];
User u = new User(
LastName = 'testuser',
Alias = 'newUser',
Email = 'test@xx.xxx.com',
UserName = 'test@xx.xxx.com',
ProfileId = p.Id,
EmailEncodingKey = 'ISO-2022-JP',
LanguageLocaleKey = 'ja',
LocaleSidKey = 'ja_JP',
TimeZoneSidKey = 'Asia/Tokyo'
);
return u;
}
static List<Account> createAcc(){
List<Account> accList = new List<Account>();
for ( Integer i=0;i<2;i++ ) {
accList.add(new Account(Name = '取引先'+i));
}
return accList;
}
}
ちなみに、runAsメソッドでは、ユーザライセンスの制限は無視されるようで、組織に追加ユーザライセンスがない場合でも、runAsメソッドを使用することで新しいユーザを作成できます。
まとめ
runAsメソッド。
いいものを知れました。
開発をしていると、どうしても特定のユーザでないとコードがカバーできない所が出てくるので、実行ユーザの指定は不可欠ですね。
おわり。
コメント