この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

Newer Version Available

This content describes an older version of this product. View Latest

テストメソッドでの混合 DML 操作

データ操作言語 (DML) 操作を実行するコードが System.runAs メソッドブロックで囲まれている場合は、テストメソッドで設定の sObject と設定以外の sObject を含む混合 DML 操作の実行が許可されます。また、テストメソッドがコールする非同期ジョブで DML も実行できます。たとえば、こうした方法を使用して、ロールのあるユーザーとその他の sObject を同じテスト内で作成できます。

設定の sObject は、「DML 操作で同時に使用できない sObject」にリストされています。

リリース時、混合 DML 操作の検証はスキップされるため、テストがリリースされたときと、ユーザーインターフェースで実行されたときとでは、テストの失敗数が異なる場合があります。

メモ

例: System.runAs ブロックでの混合 DML 操作

この例では、混合 DML 操作を System.runAs ブロックで囲み、混合 DML エラーを回避する方法を示します。System.runAs ブロックは、現在のユーザーのコンテキストで実行されます。このブロックは、ロールを持つテストユーザーとテスト取引先を作成するという混合 DML 操作を実行します。
1@isTest
2private class MixedDML {
3    static testMethod void mixedDMLExample() {  
4        User u;
5        Account a;
6        User thisUser = [SELECT Id FROM User WHERE Id = :UserInfo.getUserId()];
7       // Insert account as current user
8        System.runAs (thisUser) {
9            Profile p = [SELECT Id FROM Profile WHERE Name='Standard User'];
10            UserRole r = [SELECT Id FROM UserRole WHERE Name='COO'];
11            u = new User(alias = 'jsmith', email='jsmith@acme.com', 
12                emailencodingkey='UTF-8', lastname='Smith', 
13                languagelocalekey='en_US', 
14                localesidkey='en_US', profileid = p.Id, userroleid = r.Id,
15                timezonesidkey='America/Los_Angeles', 
16                username='jsmith@acme.com');
17            insert u;
18            a = new Account(name='Acme');
19            insert a;
20        }
21    }
22}

テストメソッドでの @future を使用した混合 DML エラーの回避

単一トランザクション内の混合 DML 操作は許可されていません。同じトランザクション内で設定の sObject と別の sObject に対する DML は実行できません。ただし、非同期ジョブの一部としてある種類の DML を実行し、別の非同期ジョブまたは元のトランザクションで他の種類を実行することは可能です。このクラスには、後続の例でクラスによってコールされる @future メソッドが含まれます。
1public class InsertFutureUser {
2    @future
3    public static void insertUser() {
4        Profile p = [SELECT Id FROM Profile WHERE Name='Standard User'];
5        UserRole r = [SELECT Id FROM UserRole WHERE Name='COO'];
6        User futureUser = new User(firstname = 'Future', lastname = 'User',
7            alias = 'future', defaultgroupnotificationfrequency = 'N',
8            digestfrequency = 'N', email = 'test@test.org',
9            emailencodingkey = 'UTF-8', languagelocalekey='en_US', 
10            localesidkey='en_US', profileid = p.Id, 
11            timezonesidkey = 'America/Los_Angeles',
12            username = 'futureuser@test.org',
13            userpermissionsmarketinguser = false,
14            userpermissionsofflineuser = false, userroleid = r.Id);
15        insert(futureUser);
16    }
17}
このクラスは、前のクラスのメソッドをコールします。
1@isTest
2public class UserAndContactTest {
3    public testmethod static void testUserAndContact() {
4        InsertFutureUser.insertUser();
5        Contact currentContact = new Contact(
6            firstName = String.valueOf(System.currentTimeMillis()),
7            lastName = 'Contact');
8        insert(currentContact);
9    }
10}