This article is a Private article. Only a writer and users who know the URL can access it. Please change open range to public in publish setting if you want to share this article with other users.
info More than 5 years have passed since last update.
Apex Specialist Last updated at 2019-07-11 Posted at 2019-07-08
Trailへのリンク
公式の翻訳
全体を通したコツ
テストクラス作成のチャレンジは、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
されるように記述する。
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();
で実行するだけで通ってしまう。
丁寧にクリアするなら、ジョブが正常に終了したかどうかを確認するべきかもしれない。
Register as a new user and use Qiita more conveniently
You get articles that match your needs You can efficiently read back useful information You can use dark theme What you can do with signing up