2011-12-13 17 views
8

Spesso trovo che mi piacerebbe poter utilizzare i rilevatori di test (ad esempio users(:david)) dalla console di Rails. C'è un modulo Rails specifico che posso caricare al prompt della console, o un gioiello che posso installare, che li renderebbe disponibili?Utilizzo di helper finder finder nella console Rails

Le mie domande su Google Oracle non hanno trasformato nulla, quindi non sto trattenendo il respiro, ma spero che qualcuno qui su SO conosca un segreto ed è disposto a condividerlo.

+0

fatemi sapere se si desidera che alcune indicazioni factory_girl. Sono sicuro che sia abbastanza potente per gestire qualsiasi complessità tu stia attualmente trattando nei tuoi dispositivi. –

risposta

7

Ho capito da solo. Funziona con IRB e Pry. Appena necessario per aggiungere le seguenti righe al mio file .irbrc (e/o .pryrc).

require 'active_record/fixtures' 

def method_missing(method_name, *args, &block) 
    if fixture_names.include?(method_name) 
    method_name.to_s.singularize.titleize.constantize.find(fixture_id(args[0])) 
    else 
    super 
    end 
end 

def fixture_id(label) 
    ActiveRecord::FixtureSet.identify(label) 
end 

def fixture_names 
    Dir["#{Rails.root}/test/fixtures/*.yml"].map { |filename| filename.match(/\/([^\/]+)\.yml/)[1].to_sym } 
end 

Ora, partendo dal presupposto che c'è un file test/fixtures/users.yml e contiene un appuntamento fisso di nome diane:, quindi users(:diane) dalla console Rails ritorna con successo quell'utente.

m_x's answer alla domanda originale era utile per raggiungere questo punto.

+0

Purtroppo questo codice non può essere incollato nella console. Per ovviare a questo, incollare prima i metodi fixture_names e fixture_id (in modo che method_missing non riceva all'infinito), quindi incollare il resto. – bronson

+0

E una piccola modifica a fixture_names consentirebbe alle fixture basate su rspec di funzionare anche: Dir ["# {Rails.root}/{test, spec}/fixtures/*. Yml"] – bronson

+0

FYI, avviso di deprecazione di Rails 4.2.1. Usa 'ActiveRecord :: FixtureSet' invece di' ActiveRecord :: Fixtures'. –

1

Interessante domanda.

Non so se questo aiuta, ma la logica attuale caricare fixture sembra sedersi in active_record/fixtures.rb - soprattutto di dare un'occhiata a ActiveRecord::TestFixtures::ClassMethods#fixtures che è la macro che si chiama di solito all'interno di una classe TestCase bambino.

La logica sembra essere ben contenuta nel modulo ActiveRecord::TestFixtures, quindi forse potresti provare a eseguire il rollover della tua classe che include quel modulo e richiederlo nella console. (sembra che sia necessario creare un'istanza di questa classe prima di accedere ai dispositivi, poiché i metodi generati dal modulo sono metodi di istanza)

+0

Grazie. Ho esplorato il codice TextFixtures e provato alcuni esperimenti di console, ma non sono riuscito a far funzionare nulla. Continuerò a sperimentare quando avrò dei momenti liberi. –

0

Lo usiamo con grande efficacia con FactoryGirl.

Se si è in grado di utilizzare factory_girl, presenta alcune funzioni davvero interessanti per la miscelazione di tratti e eredità di fabbrica. Con factory girl, accedervi tramite specifiche e accedervi tramite la console sono molto simili.

require 'factory_girl' 
user = FactoryGirl.create(:user) 

Se si utilizza bundler, è possibile creare un gruppo gioiello per gli ambienti di sviluppo e test che include fabbrica ragazza, quindi non sarà necessario richiedere quando si utilizza la console in fase di sviluppo.

group :development, :test do 
    gem 'factory_girl' 
end 
+0

Ho provato FactorGirl in diverse occasioni in passato, e ho sempre incontrato muri di mattoni non appena ho avuto bisogno di impostare relazioni complesse tra più oggetti. Non riesco a ricordare nessun dettaglio se non quello di un gusto aromatizzato di fabbrica molto aspro in bocca. Nondimeno, nella maggior parte dei casi, vorrei farlo su progetti maturi con un sacco di dispositivi consolidati e funzionanti, e provando a convertire tutto ciò in FactoryGirl solo per questo un beneficio probabilmente non sarebbe un uso saggio del mio tempo. –

+0

Anche se questo non è esattamente quello che stai cercando, puoi seguire i passaggi descritti qui: http://stackoverflow.com/a/7905915/107840. Questo fa uso del rake db: fixtures: load task. –

+0

Ho esaminato il codice sorgente Fixture e non sembra semplice. Il modulo TestFixtures deve essere incluso come m-x indicato. Tuttavia, la tua istanza deve avere callback di setup/teardown e chissà cos'altro. Ancora una volta, penso davvero che dovresti usare factory_girl o un'alternativa diversa alle fixture, se l'accesso ai dati delle fixture nella console è una funzionalità di cui hai davvero bisogno. Posso darti alcuni consigli per farti andare con factory_girl se sei interessato. –

0

L'altra risposta è incompleta, bisogna dire factorygirl per caricare le definizioni:

require 'factory_girl' 
FactoryGirl.find_definitions 
user = FactoryGirl.create(:user) 

Vedere la docs per maggiori dettagli.

2

Vorrei poter aggiungere l'eccellente risposta di Jon Garvin. Questo è proprio come la sua versione, ma non usa method_missing (che è piuttosto spaventoso nel contesto globale e non consente il completamento della tabulazione). Inoltre, attende che tu chiami load_fixtures da irb prima di caricare i tuoi dispositivi.

Inserisci questo nel tuo .irbrc o semplicemente incolla da qui.

# Loads all fixtures, then defines the Rails fixture helpers. 
# For example: users(:jon) will load the jon fixture from fixtures/users.yml 
def load_fixtures 
    require 'active_record/fixtures' 
    Dir["#{Rails.root}/{test,spec}"].each do |dir| 
    Dir["#{dir}/fixtures/*.yml"].map { |filename| filename.match(/\/([^\/]+)\.yml/)[1].to_sym }.each do |name| 
     ActiveRecord::FixtureSet.create_fixtures('spec/fixtures', name) 
     define_method(name) { |*args| 
     name.to_s.singularize.titleize.constantize.find(ActiveRecord::FixtureSet.identify(args[0])) 
     } 
    end 
    end 
end 

Esempio utilizzo:

$ irb 
irb(main):001:0> load_fixtures 
=> ["oweto/spec"] 
irb(main):002:0> users(:chuy) 
=> #<User id: 242462757, email: "[email protected]", password_digest: ...> 
Problemi correlati