Byłem zainteresowany zrobieniem tego samego, również przetestowaniem mojego modelu, który działa przy użyciu skrótu treści z zewnętrznego interfejsu API. Odkryłem, że korzystając z kilku wbudowanych funkcji factory_girl byłem w stanie w przejrzysty sposób skonstruować tego rodzaju struktury danych.
Oto wymyślony przykład:
factory :chicken, class:Hash do
name "Sebastian"
colors ["white", "orange"]
favorites {{
"PETC" => "http://www.petc.org"
}}
initialize_with { attributes }
end
Główna sztuczka polega na tym, że kiedy deklarujesz initialize_with, factory_girl nie będzie już próbować przypisywać atrybutów do wynikowego obiektu. Wydaje się również, że w tym przypadku pomija sklep db. Więc zamiast konstruować cokolwiek skomplikowanego, po prostu przekazujemy z powrotem już przygotowany hash atrybutu jako naszą zawartość. Voila.
Wydaje się, że konieczne jest określenie jakiejś wartości dla klasy, mimo że w rzeczywistości nie jest ona używana. Ma to na celu zapobieżenie próbie utworzenia instancji klasy na podstawie nazwy fabryki przez factory_girl. Zdecydowałem się użyć klas opisowych zamiast Object, ale to zależy od Ciebie.
Nadal możesz nadpisywać pola, gdy używasz jednej z tych fabryk mieszania:
chick = FactoryGirl.build(:chicken, name:"Charles")
..Jednak jeśli masz zagnieżdżoną zawartość i chcesz zastąpić głębsze pola, będziesz musiał zwiększyć złożoność bloku inicjalizacji, aby wykonać jakieś głębokie scalanie.
W twoim przypadku używasz mieszanej tablicy i danych skrótu i wydaje się, że właściwość Path powinna być ponownie używana między częściami struktury danych. Żaden problem - znasz strukturę zawartości, więc możesz łatwo stworzyć fabrykę, która prawidłowo konstruuje wynikową tablicę. Oto, jak mogę to zrobić:
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)
Nadal możesz pomijać niepotrzebne wartości. Wyobraźmy sobie, że naprawdę potrzebne są tylko Path i 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)