サードパーティの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)