Ответ 1
Мне было интересно сделать то же самое, а также проверить мою модель, которая работает с использованием хеша контента из стороннего 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 создать экземпляр класса на основе имени factory. Я решил использовать дескриптивные классы, а не Object, но это зависит от вас.
Вы по-прежнему можете переопределять поля при использовании одной из этих фабрик хеширования:
chick = FactoryGirl.build(:chicken, name:"Charles")
.. однако, если у вас есть вложенный контент и вы хотите переопределить более глубокие поля, вам нужно будет увеличить сложность блока инициализации, чтобы выполнить какое-то глубокое слияние.
В вашем случае вы используете смешанные массивы и хэш-данные, и кажется, что свойство Path должно быть повторно использовано между частями структуры данных. Нет проблем - вы знаете структуру контента, поэтому можете легко создать factory, который правильно построит результирующий массив. Вот как я могу это сделать:
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)