####全体を通したコツ
- テストクラス作成のチャレンジは、
System.assertEqual();を一切書かなくてもポイントがもらえる(要件には必要とあるにも拘らず)。真面目にクリアしたいなら、[check challenge]を押す前にSystem.assertEqual();を書くこと。一致せずエラーになればポイントがもらえることも無いはず。
#要件
- HowWeRoll Rentals社はレジャーカーレンタルを提供している。
- 事業が拡大してメンテナンスすべきレジャーカーを把握するのが難しくなったきたので、定期メンテナンスするべきレジャーカーを把握するシステムを自動化したい。
- 既存のシステムと統合して、スペアパーツの在庫も追跡したい。
#Challenge1 - 事前準備
- 要件1:メンテナンスが終了したとき(
Maintenance Requestがクローズされたとき)、新しい定期メンテナンスを登録したい。 - 要件2:最もメンテナンスサイクルが短い
Equipmentを基準に定期メンテナンスを予約したい。- 非管理パッケージのインストール
- 標準オブジェクトのラベル名変更
-
Caseオブジェクトのラベル名をMaintenance Requestに変更。 -
Productオブジェクトのラベル名をEquipmentに変更。
-
- カスタムレイアウトを割当
-
Maintenance Request:Case(HowWeRoll) Layoutを割当。 -
Equipment:Product(HowWeRoll) Layoutを割当。
-
- レコード作成を自動化
-
Maintenance Request:Type項目に選択リストを追加。RepairRoutine Maintenance
- ネックなのは、
Trigger.newには参照のidまでは含まれているけど参照先の項目までは含んでいないということ。 - トリガクラスあるいは参照先項目が必要になる直前に参照先をオブジェクトごと取得する必要がある。サブクエリを駆使して子レコードのMapを取得しよう。
-
#Challenge2 - Synchronize Salesforce data with an external system
- 要件1:部品倉庫の在庫を管理するレガシーシステムがある。
- 要件2:倉庫班が在庫を使ったとき、salesforceの
Product2が更新されるようにする。- 外部にRESTコールアウトし、JSONで外部のレコードを取得する。
- 外部IDは
Warehouse_SKU__c。 - PST(太平洋沿岸時間)で午前1時に処理される必要がある。
-
WarehouseCalloutServiceを実装する。デフォルトは以下の通り。 - まず、エンドポイントを設定する。
- [Remote Site Settings]からコールアウト先を指定して承認する。
- 次に、クラスを作成する。
- futureアノテーションは、外部サービスに非同期でコールアウトするときに使うときは
(callout=true)を並べて書く。 - 困ったことに、外部IDにあたる項目は重複を許可していたり必須項目でもない。このためか、普通に
upsertしてもすべてinsertされて同じレコードがいくつも出来てしまう。- なんと、この状態でも500P貰うことができる。
- これでは練習にならないので、
Database.upsert()を使って正しくupsertされるように記述する。
- futureアノテーションは、外部サービスに非同期でコールアウトするときに使うときは
#Challenge3 - Schedule synchronization
- 要件1:コールアウト処理をスケジュールする。
- 標準時がPSTに指定されているので、組織の標準時間をこれに合わせる。
#Challenge4 - Test automation logic
- 要件1:トリガクラスのカバレッジ率を100%に上げる。
- 要件2:ただ100%にするのではなく、アサーションを用いて期待値を確認する。
- ...と言いつつアサーションを一切使わなくても500P取ることができる。終わらせたかったら、とりあえず100%になったら[check challenge]してみよう。
-
Work_Part__cが参照できるEquipment__cには条件があるので、レコード作成前に確認すること。
#Challenge5 - Test callout logic
- 要件1:コールアウト処理のカバレッジ率を100%に上げる。
- コールアウトのテストクラスは、リクエストを受け取って擬似レスポンスを返すMockクラスが必要。
- MockについてTrailheadより分かりやすい解説
- Mockクラスに擬似コールアウトするテストクラスは、以下の2行をstart/stopで挟むだけで実行できる。
Test.setMock(HttpCalloutMock.class, new mockClass);CalloutClass.CalloutMethod();- responseの中身を
assertEqualで比較することが本来求められる。
#Challenge6 - Test scheduling logic
- scheduleクラスを
System.schedule();で実行するだけで通ってしまう。 - 丁寧にクリアするなら、ジョブが正常に終了したかどうかを確認するべきかもしれない。