Мені було цікаво зробити те саме, також протестувати мою модель, яка працює, використовуючи хеш контенту від сторонніх 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)