こんにちは、なかやまです。
Salesforceで開発して早6年になります。Salesforceの開発は面白いですよね。SaaSでカスタマイズしたり、PaaSでゴリッと開発してみたり。またはAWS開発したサイトと組み合わせてみたりと、毎日楽しんで開発しています♪
今日のお話は同僚から聞いた、「テストクラスで作成日が指定できない!?」です。
それではどうぞ↓↓↓↓↓
「Apexテストクラスで作成日が指定できない!?」
テストコード対応中のお話です。
最近のリリースでは、Apexテストの中でレコードの作成日を指定するメソッドが使えるようになったそうですが、、なんだかテストコードが上手く動いていないみたいです。
こんなかんじのテストコード↓
@isTest private class SetCreatedDateTest { static testMethod void testSetCreatedDate() { Account a = new Account(name='myAccount'); insert a; Test.setCreatedDate(a.Id, DateTime.newInstance(2012,12,12)); // ↓ここでエラーになるぞ! System.assertEquals(a.CreatedDate, DateTime.newInstance(2012,12,12)); } }
チームメンバーがリファレンスを見て、一言。
このあとリファレンス通りに実装したことで、やりたいテストケースが実現できたようです。よかったね!
さて、みなさん。テストコード書いてますか!
最近のリリースでテストコード内で作成日の設定ができるメソッドが使えるようになったそうです。このメソッド「Test.setCreatedDate」ですが、私は初めて知りました。
リファレンスに書いてあったソースコードにコメントを付けました。
@isTest private class SetCreatedDateTest { static testMethod void testSetCreatedDate() { // 1.取引先を1件作成する Account a = new Account(name='myAccount'); insert a; // 2.作成した取引先の作成日を設定する
// ※ここで変数aの作成日は変更されないっぽいよ! Test.setCreatedDate(a.Id, DateTime.newInstance(2012,12,12)); // 3.必ずstartTestさせる Test.startTest(); // 4.startTestした後に、selectする Account myAccount = [SELECT Id, Name, CreatedDate FROM Account WHERE Name ='myAccount' limit 1]; // 5.作成日が指定したものと一致する! System.assertEquals(myAccount.CreatedDate, DateTime.newInstance(2012,12,12)); Test.stopTest(); } }
レコードの作成日を処理条件に使っている場合、テストコードでデータを作成するとほぼ全て同じ時間で作成されるため、想定したテストケースにならない。。なんてことが昔はありました。。
このメソッドがあればバッチリテストできますね!
是非、明日からご活用ください〜
Apexテストで作成日を変更する時に忘れないこと
- Test.setCreatedDateは設定した後に必要なデータはselectしましょう!
- Test.start()したあとで使いましょう!
参考
Apex テストでの CreatedDate 項目の設定と変更(Spring'16)
また身近な困った話をお伝えできたらと思いますmm