6

Desidero impostare un active_record_spec_helper per i miei test Rails in modo che possa testare i miei modelli senza dover impostare l'intero ambiente Rails, come stabilito da Corey Haines nel suo excellent blog post on the subject.che richiede un modello ActiveRecord senza dover richiedere l'intero diagramma di classe, per active_record_spec_helper

(so che preloaders come Spring o Guardia andare una parte del cammino verso la risoluzione di questo problema, ma sono d'accordo con la tesi di Corey che questo è "in realtà solo un cerotto sopra il vero problema".)

così ho creato il mio aiuto specifiche e altri file come stabilito nel post sul blog di Corey e - ma il mio problema è esattamente come lo descrivo nel my comment su quello stesso succo:

in sostanza, le associazioni tra i miei modelli significano per testare un singolo modello, devo fare require così tanti altri file modello che nega il punto di utilizzo di active_record_spec_helper in primo luogo .

E.g. se voglio testare comment.rb ma il mio commento belongs_to :post, allora devo richiedere post e comment per far funzionare i miei test. Ma allora lo Post potrebbe avere altre associazioni, ad es. belongs_to :user; has_many :drafts, quindi devo richiedere user e drafts e solo per testare Comment ... quindi user e drafts hanno associazioni anche, e così via fino a quando non finisco di caricare praticamente ogni modello nel mio diagramma di classe.

(Se questo non ha senso, ho dato una spiegazione più dettagliata in the comment.)

E 'possibile ovviare a questo ed evitare di dover require tutti quei file modello estranei? O c'è qualcosa di concettuale che mi manca - dovrei evitare di collegare tutti i miei modelli in questo gigantesco web, o è inevitabile?

Oppure non vale la pena e dovrei limitarmi a lasciare che rails_helper carichi l'intero ambiente?

risposta

2

Non penso che manchi qualcosa di concettuale e penso che avere modelli collegati in una rete gigante attraverso le associazioni sia naturale nelle grandi applicazioni Rails.

quanto riguarda soluzioni a questo problema, posso pensare a diverse:

  • stub ai modelli dipendevano durante la prova dei modelli che dipendono direttamente su di essi. Ciò eliminerà la necessità di caricare o stub dei modelli da cui dipende indirettamente.

  • Attivare il caricamento automatico. Anche se questo rallenterà le cose, non è la stessa cosa che avviare tutte le Rails

  • Invece di elencare semplicemente le dipendenze come commenti nella parte superiore dei modelli come suggerito da Corey, esprimili in codice Ruby. Questo codice può essere un no-op in produzione, ma nel test è possibile configurare il codice per richiedere o interrompere le dipendenze come si desidera.

+0

Come posso attivare l'autoloading senza caricare l'intera app Rails? È da qualche parte in ActiveSupport? – GMA

+0

Il meccanismo di caricamento automatico di Ruby non è sufficiente da solo e non sono sicuro se/come il meccanismo di Rails costruito su di esso possa essere chiamato separatamente. Probabilmente non avrei dovuto essere così disinvolto nel descrivere questa opzione. Se non riesci a trovare qualcosa in una gemma Rails utilizzabile così com'è, puoi leggere le informazioni su http://urbanautomaton.com/blog/2013/08/27/rails-autoloading-hell/, ad esempio e forse tira il tuo. –

0

Sono stato in grado di risolvere questo problema utilizzando FactoryGirl. Si prega di see my gist for details.

Utilizzando il factory_girl_require_helper.rb, si può fare qualcosa di simile nella parte superiore del tuo test:

require_factory_and_model_for(:comment) 

che si auto-caricare i modelli associati che dipendono dalla Comment basata sulla fabbrica che avete definito per esso.