####全体を通したコツ
- テストクラス作成のチャレンジは、
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
項目に選択リストを追加。Repair
Routine 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();
で実行するだけで通ってしまう。 - 丁寧にクリアするなら、ジョブが正常に終了したかどうかを確認するべきかもしれない。