Byłem zainteresowany robieniem tego samego, także przetestować model kopalni, który działa przy użyciu skrótu treści z API innej firmy. Zauważyłem, że używając kilku wbudowanych funkcji factory_girl udało mi się oczyścić konstrukcje tego typu danych.
Oto zmyślony przykład:
factory :chicken, class:Hash do
name "Sebastian"
colors ["white", "orange"]
favorites {{
"PETC" => "http://www.petc.org"
}}
initialize_with { attributes }
end
Głównym Sztuką jest to, że kiedy zadeklarować initialize_with, factory_girl nie będzie próbować przypisać atrybuty do powstałego obiektu. Wydaje się także, że w tym przypadku pomija magazyn db. Tak więc, zamiast tworzyć coś skomplikowanego, po prostu przekazujemy już przygotowany skrót hasłowy jako naszą treść. Voila.
Wydaje się, że konieczne jest podanie pewnej wartości dla klasy, mimo że nie jest ona faktycznie używana. Ma to na celu uniemożliwienie factory_girl próby utworzenia instancji klasy na podstawie nazwy fabryki. Postanowiłem użyć klas opisowych zamiast Object, ale to zależy od ciebie.
Nadal jesteś w stanie przesłonić pól podczas korzystania z tych fabryk hash:
chick = FactoryGirl.build(:chicken, name:"Charles")
..however, jeśli zagnieżdżony treści i chcą zastąpić głębsze pól trzeba będzie zwiększyć złożoność bloku inicjalizacyjnego do pewnego rodzaju głębokiego scalenia.
W twoim przypadku używasz mieszanych danych tablicowych i mieszających, i wygląda na to, że właściwość Path powinna zostać ponownie wykorzystana między częściami struktury danych. Nie ma problemu - znasz strukturę treści, dzięki czemu możesz łatwo utworzyć fabrykę, która poprawnie tworzy 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 również pominąć niepotrzebne wartości. Wyobraźmy sobie tylko ścieżka i rev są naprawdę konieczne:
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)
Czy naprawdę potrzebny jest fabrycznie do tego? Dlaczego po prostu nie zdefiniować metody, która zwraca symulowaną odpowiedź? – zetetic
Tak właśnie zrobiłem. Ale myślałem, że celem Fabryk jest izolowanie tych rzeczy. Wciąż jestem ciekawy - wydaje mi się, że klasy są Hash i Array, i to powinno działać, jeśli mogę po prostu uzyskać właściwą składnię. – Doug
Użyłem ich tylko do generowania instancji modelu ActiveRecord. FactoryGirl ma zastąpić urządzenia. Możesz rzucić okiem na pomocnicze metody RSpec: https://www.relishapp.com/rspec/rspec-core/v/2-9/docs/helper-methods – zetetic