Mi interessava fare la stessa cosa, anche per testare un mio modello che funziona usando un hash di contenuto da un'API di terze parti. Ho scoperto che, utilizzando alcune delle funzionalità integrate di factory_girl, ero in grado di costruire in modo pulito questo tipo di strutture di dati.
Ecco un esempio inventato:
factory :chicken, class:Hash do
name "Sebastian"
colors ["white", "orange"]
favorites {{
"PETC" => "http://www.petc.org"
}}
initialize_with { attributes }
end
Il trucco principale è che quando si dichiara initialize_with, factory_girl non sarà più tenterà di assegnare gli attributi per l'oggetto risultante. Sembra anche saltare l'archivio db in questo caso. Quindi, invece di costruire qualcosa di complicato, passiamo semplicemente l'hash dell'attributo già preparato come contenuto. Ecco.
Sembra necessario specificare un valore per la classe, nonostante non sia effettivamente utilizzato. Questo per impedire a factory_girl di tentare di istanziare una classe in base al nome della fabbrica. Ho scelto di utilizzare classi descrittive piuttosto che Object, ma dipende da te.
Sei ancora in grado di sostituire i campi quando si utilizza uno di questi stabilimenti hash:
chick = FactoryGirl.build(:chicken, name:"Charles")
..however, contenuto se hai nidificato e vuole sovrascrivere i campi più profondi è necessario aumentare la complessità del blocco di inizializzazione per fare una sorta di fusione profonda.
Nel tuo caso, stai utilizzando dati misti di array e hash e sembra che la proprietà Path debba essere riutilizzata tra porzioni della struttura dati. Nessun problema: conosci la struttura del contenuto, quindi puoi creare facilmente una factory che costruisca correttamente la matrice risultante. Ecco come potrei farlo:
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)
Sei anche libero di omettere valori non necessari. Immaginiamo unica strada e il contagiri sono realmente necessari:
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)
Avete veramente bisogno di una fabbrica per questo? Perché non basta definire un metodo che restituisce la risposta simulata? – zetetic
Questo è quello che ho finito per fare. Ma pensavo che il punto delle Fabbriche fosse isolare questa roba. Sono ancora curioso: sembra che Hash e Array siano classi e questo dovrebbe funzionare se riesco a trovare la sintassi giusta. – Doug
Li ho usati solo per generare istanze di modelli ActiveRecord. FactoryGirl è destinato a sostituire i dispositivi. Potresti dare un'occhiata ai metodi di supporto di RSpec: https://www.relishapp.com/rspec/rspec-core/v/2-9/docs/helper-methods – zetetic