私は、サードパーティ API からのコンテンツのハッシュを使用して動作する私のモデルをテストするために、同じことを行うことに興味がありました。factory_girl の組み込み機能をいくつか使用することで、この種のデータ構造をきれいに構築できることがわかりました。
これは不自然な例です:
factory :chicken, class:Hash do
name "Sebastian"
colors ["white", "orange"]
favorites {{
"PETC" => "http://www.petc.org"
}}
initialize_with { attributes }
end
ここでの主なトリックは、initialize_with を宣言すると、factory_girl が結果のオブジェクトに属性を割り当てようとしなくなることです。この場合、db ストアもスキップするようです。したがって、複雑なものを構築する代わりに、既に準備された属性ハッシュをコンテンツとして返すだけです。出来上がり。
実際には使用されていませんが、クラスに何らかの値を指定する必要があるようです。これは、factory_girl がファクトリ名に基づいてクラスをインスタンス化しようとするのを防ぐためです。Object ではなく記述的なクラスを使用することにしましたが、それはあなた次第です。
これらのハッシュ ファクトリのいずれかを使用すると、フィールドをオーバーライドできます。
chick = FactoryGirl.build(:chicken, name:"Charles")
..ただし、ネストされたコンテンツがあり、より深いフィールドをオーバーライドしたい場合は、ある種の深いマージを行うために初期化ブロックの複雑さを増す必要があります。
あなたの場合、いくつかの混合配列とハッシュ データを使用しており、データ構造の部分間で Path プロパティを再利用する必要があるようです。問題ありません。コンテンツの構造を知っているので、結果の配列を適切に構築するファクトリを簡単に作成できます。これが私がそれを行う方法です:
factory :dropbox_hash, class:Array do
path "/home"
revision 48
rev "30054214dc"
thumb_exists false
bytes 0
modified { 3.days.ago }
is_dir true
icon "folder_app"
root "app_folder"
size "0 bytes"
initialize_with { [ attributes[:path], attributes ] }
end
FactoryGirl.build(:dropbox_hash, path:"/Chickens", is_dir:false)
また、不要な値を自由に省略できます。Path と rev だけが本当に必要だと想像してみましょう:
factory :dropbox_hash, class:Array do
path "/home"
rev "30054214dc"
initialize_with { [ attributes[:path], attributes ] }
end
FactoryGirl.build(:dropbox_hash, path:"/Chickens", revision:99, modified:Time.now)