J'ai été intéressé à faire la même chose, aussi de tester un modèle de la mienne qui fonctionne à l'aide d'un hachage du contenu à partir d'un 3e partie de l'API. J'ai trouvé qu'en utilisant quelques-uns des fonctionnalités intégrées de factory_girl j'ai pu proprement construire ce genre de structures de données.
Voici un exemple artificiel:
factory :chicken, class:Hash do
name "Sebastian"
colors ["white", "orange"]
favorites {{
"PETC" => "http://www.petc.org"
}}
initialize_with { attributes }
end
L'astuce ici est que, lorsque vous déclarez initialize_with, factory_girl ne tenteront plus d'affecter les attributs de la résultante de l'objet. Il semble également ignorer la db magasin dans ce cas. Donc, plutôt que de construire quelque chose de compliqué, nous venons de passer en arrière de la déjà préparé attribut de hachage que notre contenu. Le tour est joué.
Il ne semble pas nécessaire de spécifier une valeur pour le cours, en dépit de ce pas en réalité. C'est pour éviter d'factory_girl de tenter d'instancier une classe basée sur le nom de l'usine. J'ai choisi d'utiliser descriptif des classes plutôt que de l'Objet, mais c'est à vous.
Vous êtes toujours en mesure de remplacer les champs lorsque vous utilisez l'un de ces usines de hachage:
chick = FactoryGirl.build(:chicken, name:"Charles")
..cependant, si vous avez le contenu imbriqué et souhaitez remplacer les plus profondes des champs, vous devrez augmenter la complexité de l'initialisation du bloc pour faire une sorte de profondeur de fusion.
Dans votre cas, vous êtes en utilisant un mélange de tableau de hachage et de données, et il semble que le Chemin d'accès à la propriété devraient être réutilisé entre des parties de la structure de données. Pas de problème - vous connaître la structure du contenu, de sorte que vous pouvez facilement créer une usine qui construit le tableau résultant correctement. Voici comment je peut faire:
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)
Vous êtes également libre de les omettre les valeurs inutiles. Imaginons un seul Chemin et rev sont vraiment nécessaires:
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)