tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Test.loadDataとリレーション設定について

テストクラスを実装時、マスタ系オブジェクトのテストデータ作成用にTest.loadDataが用意されています。とても便利なのですが別オブジェクトとのリレーション設定が普通の方法では設定できませんでした。


他オブジェクトとのリレーション設定が必要な場合は、Test.loadDataの利用を諦めるしかないかなと思っていたのですが、この問題の解決方法を海外のSalesforce Developerがブログで紹介してくれました。

f:id:tyoshikawa1106:20160112215609p:plain

Using Test.loadData to import records with relationship


・・・ということで自分のDev環境でどんな感じか確認してみました。


次のように親オブジェクト側でID項目を用意します。(このとき18桁の文字列である必要はありませんでした。)
f:id:tyoshikawa1106:20160112220659p:plain


子オブジェクト側では参照項目に紐付けたい親オブジェクトのID項目の値をセットします。
f:id:tyoshikawa1106:20160112220722p:plain


これでTest.loadDataでテストデータを作成した際に紐付けが行われるようになります。


※CSVは静的リソースにアップします。

Account用のCSV

f:id:tyoshikawa1106:20160112221104p:plain

Contact用のCSV

f:id:tyoshikawa1106:20160112221052p:plain


まず、Account用のCSVがTest.loadDataで正常に読み込めるかのチェックをしてみます。用意した5件分のレコードが正常に読み込まれていることを確認できます。
f:id:tyoshikawa1106:20160112221929p:plain


同じようにContact用のCSVも確認します。こちらも問題なく読み込めます。
f:id:tyoshikawa1106:20160112222052p:plain


次がメインの検証です。サブクエリをつかって取引先と取引先に紐付く取引先責任者を取得してみます。
f:id:tyoshikawa1106:20160112222314p:plain


System.assertEqualsでチェックする内容は次のとおりです。取引先と取引先責任者が紐付いていればきちんとテストが通る想定です。
f:id:tyoshikawa1106:20160112222411p:plain



実行した結果、無事にすべてのテストをパスすることを確認できました。
f:id:tyoshikawa1106:20160112222628p:plain


上記の通りTest.loadDataでテストデータを用意するときに、オブジェクト間の紐付けを設定するには、擬似的なID項目を用意して対応すればいいみたいです。


ちなみに擬似的に用意したID項目の値ですが、値の存在判定は問題なく実行できますが、「 = '1' 」という判定をしようとするとエラーになります。
f:id:tyoshikawa1106:20160112223207p:plain


※StringExceptionになります。
f:id:tyoshikawa1106:20160112223307p:plain


ひょっとしてきちんと18桁のIDと比較すればエラーにならないかもと思い試してみました。(他のレコードのID値と比較する形で検証)
f:id:tyoshikawa1106:20160112223620p:plain


結果は次のとおりです。
f:id:tyoshikawa1106:20160112223913p:plain


擬似的にセットした文字列 "1" は Test.loadDataで読み込まれた後、きちんとID形式の値に変換されるみたいです。


以上、Test.loadData使用時にリレーションを設定する方法でした。これを活用することでマスタ系のテストデータ作成がよりやりやすくなると思います。

サンプルコード

関連記事