【Salesforce】テストクラスで実行ユーザを指定する

【Salesforce】テストクラスで実行ユーザを指定する

Salesforceにて、プロファイルで処理を分岐や、レコードの共有を考慮したコードを作成しますよね。

テストクラスの実行ユーザは通常ではシステムモードとなりますが、明示的にユーザを指定して実行することができます。

https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_testing_tools_runas.htm

テストコード内でのみ使用可能な「System.runAs」メソッドというものがあります。

Profile p;
User u;

// プロファイルを取得する
p = [select Id from Profile where Name = 'ProfileName'];
// ユーザを作成する
u = new User();
u.LastName = 'test';
u.Alias = 'test';
u.Email = 'test' + Date.today.format() + '@test.com';
u.UserName = u.Email;
u.EmailEncodingKey = 'ISO-2022-JP';
u.TimeZoneSidKey = 'Asia/Tokyo';
u.LocaleSidKey = 'ja_JP';
u.LanguageLocaleKey = 'ja';
u.profileId = p.Id;
insert u;

Test.startTest();

    // 作成したユーザで処理を実行
    System.runAs(u){
        // テスト
    }

Test.stopTest();

また、テストクラス内で設定レコードと非設定レコードを作成する際にも利用できます。

通常であれば同じトランザクションで両方を作成することはできませんが、ユーザを変更することで両方を作成することが可能になります。

例えば、取引先レコードをシステムモードで作成し、公開グループレコードをrunAsの別ユーザで作成するようなイメージです。

Profile p;
User u;
Account acc;
Group g;

// プロファイルを取得する
p = [select Id from Profile where Name = 'ProfileName'];
// ユーザを作成する
u = new User();
u.LastName = 'test';
u.Alias = 'test';
u.Email = 'test' + Date.today.format() + '@test.com';
u.UserName = u.Email;
u.EmailEncodingKey = 'ISO-2022-JP';
u.TimeZoneSidKey = 'Asia/Tokyo';
u.LocaleSidKey = 'ja_JP';
u.LanguageLocaleKey = 'ja';
u.profileId = p.Id;
insert u;

// 取引先を作成する
acc = new Account();
acc.Name = 'TEST';
insert acc;

Test.startTest();

    // 作成したユーザで公開グループを作成する
    System.runAs(u){
        
        g = new Group();
        g.Name = 'TestGroup';
        g.DeveloperName = 'Test';
        g.Type = 'Regular';
        insert g;
    }

Test.stopTest();

ちなみに、上に貼ったURLではユーザのinsertを行っていません。

ユーザ数の上限を無視することができるそうですよ。

No comments.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です