2009-12-14 9 views
13

Sto usando seeds.rb per popolare un po 'di Stato dati modello di riferimento:Impedire Rails prova elimini dati semi

State.create :name => 'Alabama', :abbreviation => 'AL' 
State.create :name => 'Alaska', :abbreviation => 'AK' 
# ... 

Anche se io non sto usando infissi statali (dal momento che è i dati di semi per cominciare, penso che non sarebbe ASCIUTTO dover duplicare questo solo per i test), il framework di test di Rails sembra cancellare tutti i dati seme di stato durante i test. (Sto cadendo, ricreando, migrando e resettando il test db, e confermato che i dati sono lì prima dell'esecuzione di un test di unità.)

Il risultato è questa affermazione che ha esito positivo in semi.rb ma fallisce in un test su una riga :

assert_equal 51, State.all.size 

1) Failure: 
test_state_seeds_are_present(StateTest) [/test/unit/state_test.rb:24]: 
<51> expected but was 
<0>. 
1 tests, 1 assertions, 1 failures, 0 errors 

ho provato entrambi i modelli non statali elencando esplicitamente nel infissi istruzione class test di base, così come lanciando la bandiera infissi transazionale (come previsto, questo riguarda solo i record creati durante il test). Naturalmente il test in esame non è di per sé la cancellazione di questi record.

I record di stato vengono sempre eliminati. C'è un modo per dire a Rails di togliere le mani dai dati seme? Devo duplicare tutti i dati nei dispositivi per assicurarmi che vengano ricaricati? A parte un grande evento politico, mi aspetto che i dati dello stato siano relativamente stabili.

tia

+0

Grazie ragazzi, mi cercheranno entrambi (una tantum) e weppos' (sulla configurazione) suggerimento per le sementi in modo esplicito il caricamento di Luca dati nei test e vedere quale funziona meglio per i miei scopi. Prenderò per scontato che i test immetteranno sempre prima i dati del database. – aaron

risposta

12

test cancellare tutti i dati dal database e quindi caricare i vostri dispositivi (se ne avete).

È necessario ottenere l'helper di test per caricare il file seme prima dell'esecuzione dei test. Ci sono un paio di modi per farlo, date un'occhiata al mio simile domanda: How to load db:seed data into test database automatically?

Il modo più semplice è probabilmente solo per aggiungere

require "#{Rails.root}/db/seeds.rb"

alla parte superiore del file test_helper.rb (a patto di utilizzare il framework di test integrato).

+1

Questo non funziona per me, se aggiungo quella linea al mio dispositivo funziona ok, ma se lo metto in test_helper.rb, i dati seme sembrano essere svaniti prima che i miei test vengano raggiunti. – dangerousdave

+3

Avete un file yml di fixture per una classe che state cercando di popolare nel file seme? Perché ciò spazzerà via tutti i dati durante l'esecuzione dei proiettori. Elimina il file fixture per i semi; oppure, se non puoi farlo, usa l'esempio di Simone dove i dati delle fixture vengono caricati prima di ogni singolo test. –

+0

ahh, avevo commentato il mio file .yml, ma ciò sembra non essere sufficiente, la sua semplice presenza causa la sovrascrittura dei dati seme. Cancellato, e tutto va bene, grazie per il tuo aiuto Luca – dangerousdave

4

La funzione "seed" non è integrata nell'architettura di test. I test sono costruiti attorno alle fixture e ogni volta che si esegue la suite di test, Rails carica i dati dalle fixture e sostituisce il contenuto esistente.

Tuttavia, avere il database popolato con i dati seme è davvero semplice.

Nel file test_helper.rb aggiungere un nuovo metodo di installazione nella classe ActionSupport::TestCase di base.

class ActionSupport::TestCase < ... 

    setup :load_seeds 

    protected 

    def load_seeds 
     load "#{Rails.root}/db/seeds.rb" 
    end 

end 
+0

Questo ricaricherà i tuoi dati seme prima di ogni caso di test, che probabilmente non ha bisogno di eseguire. Finché si suppone che i dati seme siano costanti (cosa che dovrebbe), è necessario caricarli una volta sola. –

+0

Questo è quello che pensavo Luke, ma sembra essere stato cancellato a prescindere, quindi sembra che dovrò implementare una sorta di soluzione alternativa per assicurarmi che sia presente nel db per i test. – aaron

+1

Hai un file states.yml nella directory delle fixture? Anche se è vuoto, i dati degli stati verranno eliminati. Mi assicuro sempre di eliminare le fixture per le mie tabelle di dati seme (in realtà non uso più affatto fixture ma questa è un'altra storia). –

0

Concordo con weppos per quanto riguarda il modo migliore per farlo, ma per ragioni di completezza e per il bene delle persone che possono già avere file accessori si può prendere l'altro approccio e seminare il database dalla infissi esistenti.

Questo si ottiene facendo qualcosa di simile a quanto segue nel file db/seeds.rb

RAILS_FIXTURES = "#{Rails.root}/spec/fixtures" 

models_loaded_from_fixtures = %w[Modela Modelb Modelc ....] 

models_loaded_from_fixtures.each do |model| 
    Fixtures.create_fixtures(RAILS_FIXTURES, "#{model.tableize}") 
    puts "Loaded #{model.constantize.all.size} #{model.pluralize}" 
end 

Si potrebbe in alternativa leggere la directory fixures e creare un array di nomi di file da elaborare, ho scelto il processo di cui sopra come ho voluto essere in grado di specificare quale dei miei molti dispositivi esistenti ho voluto seminare il DB con.

0

Mi interrogo sulla necessità di scrivere un test del genere in primo luogo. Stai verificando che l'attività di seed data rake funzioni correttamente o vuoi testare il comportamento dell'implementazione della classe State? Sto assumendo quest'ultimo, quindi scriverò test che si concentrano sul comportamento e useremo Factory Girl (o simili) dal momento che accenni al fatto che non stai usando i proiettori. Assicurarsi di rimuovere la riga fixtures :all da test/test_helper.rb.

Per iniettare un compito nel normale flusso di test in esecuzione, questo è un approccio che ha sempre lavorato per me:

namespace :test do 
    task :force_environment do 
    ENV['RAILS_ENV'] = 'test' 
    RAILS_ENV.replace('test') 
    end 
end 

%w(test:units test:functionals test:integration).map do |task_name| 
    task = Rake::Task[task_name] 
    task.clear_prerequisites 

    task.enhance %w(db:test:prepare test:force_environment db:seed) 
end 

Basta mettere che in un file chiamato lib/tasks/testing.rake e otterrà raccolto quando si Prossima esecuzione rake test o altra attività correlata al test.

+0

Ciao Patrick. In realtà non ho bisogno di testare il modello di Stato in sé, è solo un esempio che dimostra che i dati seme non sono presenti. Il modello di stato (dati di riferimento) viene utilizzato nella convalida degli indirizzi e i test di convalida dell'indirizzo non sono riusciti poiché i dati di stato non erano nel db. – aaron

+0

Questo ha più senso. L'attività di Rake dovrebbe funzionare per te, ma sembra che tu abbia funzionato. –

0

Ho avuto lo stesso problema, ma la risposta standard non ha funzionato per me.

Il mio problema riguardava le posizioni nei file di classe che eseguivano una ricerca nel database di costanti e named_scopes. Non ho trovato alcun modo per avere i dati seme caricati al momento giusto.

Ho trovato un modo per escludere l'eliminazione, che stava accadendo anche se avevo cancellato il mio file di fixture per la tabella mancante.

RAILS_ENV = test rake db:. Semi rubino -Itest test/unità/* rb

Problemi correlati