tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Spring'16のテストクラスに関するバグ修正

Spring'16でテストクラス関連のバグ修正あったみたいです。
f:id:tyoshikawa1106:20160218115059p:plain

リリースノート

Apex テストで確実に制限をリセットするための Test.startTest() のコール

Test.startTest() メソッドと Test.stopTest() メソッドで囲まれたテストコードのブロックで、ガバナ制限の独自のブロックを確実に受信できるようになりました。
Test.startTest() は、トランザクション単位の制限カウンタを保存し、カウンタを一時的に 0 にリセットします。
Test.stopTest() は、制限カウンタを Test.startTest() 前の値に戻します。テストメソッドが完了すると、すべてのトランザクション単位の制限は 0 にリセットされます。
以前は、SOQL クエリなどの場合の一部の制限は、Test.startTest()/Test.stopTest() ブロック内ではリセットされないことがありました。

Apex テストでの重大な MIXED_DML_OPERATION エラーを回避するための @future の使用

単一トランザクション内の混合データ操作言語 (DML) 操作は許可されていません。同じトランザクション内で設定の sObject と設定以外の sObject に対する DML は実行できません。

代わりに、非同期ジョブの一部として 1 つのデータ型の DML を実行し、別の非同期ジョブまたは元のトランザクションで他のデータ型を実行できます。この代替方法は広く使用されています。

ただし、この代替方法が Apex テストのコンテキスト内で使用された場合、エラーが発生していました。このバグは修正されました。

サンプルコード

@isTest
public class UserAndContactTest {
    public testmethod static void testUserAndContact() {
        InsertFutureUser.insertUser();
        Contact currentContact = new Contact(
            firstName = String.valueOf(System.currentTimeMillis()),
            lastName = 'Contact');
        insert(currentContact);
    }
}
public class InsertFutureUser {
    @future(Delay='0')
    public static void insertUser() {
        Profile p = [SELECT Id FROM Profile WHERE Name='Standard User'];
        UserRole r = [SELECT Id FROM UserRole WHERE Name='COO'];
        User futureUser = new User(firstname = 'Future', lastname = 'User',
            alias = 'future', defaultgroupnotificationfrequency = 'N',
            digestfrequency = 'N', email = 'test@test.org',
            emailencodingkey = 'UTF-8', languagelocalekey='en_US', 
            localesidkey='en_US', profileid = p.Id, 
            timezonesidkey = 'America/Los_Angeles',
            username = 'futureuser" + System.now() +  "@test.org',
            userpermissionsmarketinguser = false,
            userpermissionsofflineuser = false, userroleid = r.Id);
        insert(futureUser);
    }
}

Apex テストでの通貨と小数の比較

Apex テストで通貨値と小数値を比較するときに例外が発生するバグが修正されました。通貨値と小数値の両方が含まれるデータサイロを使用して、それらのデータ型を関心のあるコンテンツと比較できるようになりました。

WSDL ベースの非同期コールアウトのテスト

以前は、WSDL ベースの同期コールアウトまたは WSDL ベース以外の非同期コールアウトをテストできました。ただし、インポートした WSDL から行われた非同期コールアウトをテストすると、テストが内部 Salesforce エラーで失敗していました。このバグは修正されました。