テストクラスを実装時、マスタ系オブジェクトのテストデータ作成用にTest.loadDataが用意されています。とても便利なのですが別オブジェクトとのリレーション設定が普通の方法では設定できませんでした。
他オブジェクトとのリレーション設定が必要な場合は、Test.loadDataの利用を諦めるしかないかなと思っていたのですが、この問題の解決方法を海外のSalesforce Developerがブログで紹介してくれました。
・・・ということで自分のDev環境でどんな感じか確認してみました。
次のように親オブジェクト側でID項目を用意します。(このとき18桁の文字列である必要はありませんでした。)
子オブジェクト側では参照項目に紐付けたい親オブジェクトのID項目の値をセットします。
これでTest.loadDataでテストデータを作成した際に紐付けが行われるようになります。
※CSVは静的リソースにアップします。
Account用のCSV
Contact用のCSV
まず、Account用のCSVがTest.loadDataで正常に読み込めるかのチェックをしてみます。用意した5件分のレコードが正常に読み込まれていることを確認できます。
同じようにContact用のCSVも確認します。こちらも問題なく読み込めます。
次がメインの検証です。サブクエリをつかって取引先と取引先に紐付く取引先責任者を取得してみます。
System.assertEqualsでチェックする内容は次のとおりです。取引先と取引先責任者が紐付いていればきちんとテストが通る想定です。
実行した結果、無事にすべてのテストをパスすることを確認できました。
上記の通りTest.loadDataでテストデータを用意するときに、オブジェクト間の紐付けを設定するには、擬似的なID項目を用意して対応すればいいみたいです。
ちなみに擬似的に用意したID項目の値ですが、値の存在判定は問題なく実行できますが、「 = '1' 」という判定をしようとするとエラーになります。
※StringExceptionになります。
ひょっとしてきちんと18桁のIDと比較すればエラーにならないかもと思い試してみました。(他のレコードのID値と比較する形で検証)
結果は次のとおりです。
擬似的にセットした文字列 "1" は Test.loadDataで読み込まれた後、きちんとID形式の値に変換されるみたいです。
以上、Test.loadData使用時にリレーションを設定する方法でした。これを活用することでマスタ系のテストデータ作成がよりやりやすくなると思います。
サンプルコード
関連記事