2009-06-02 9 views
7

Attualmente sono in procinto di iniziare una migrazione da dispositivi alle fabbriche e l'esecuzione di alcune sfide del database di test.Come posso ricostruire il database di test di Rails prima di ogni test?

Quando eseguo l'intera suite di test, il database viene pulito e i nuovi dati generati in fabbrica vengono ricaricati. Tuttavia, quando eseguo test di unità individuali, il database non cancella i vecchi valori.

Potrei eseguire rake db: test: preparare prima di ogni singolo test, ma ciò rallenterebbe il mio sviluppo.

Qui sono le mie impostazioni di test:

self.use_transactional_fixtures = false 
    self.use_instantiated_fixtures = true 

Per esempio:

require File.dirname(__FILE__) + '/../test_helper' 
class LocationTest < ActiveSupport::TestCase 
    test "should require name to save" do 
    location = Factory.create(:location) 
    end 
end 

verrà eseguito una volta con successo, ma non vengono eseguiti sulle successive esecuzioni di file di test. Ciò non è mai accaduto in precedenza perché i dispositivi di prova verrebbero caricati ad ogni corsa.

ho aggiunto sequenziamento fabbrica, ma gli attributi che solo sequenze durante ogni corsa:

Factory.define :location do |l| 
    l.sequence(:name) {|n| "place#{n}"} 
    l.street '123 N Pitt Street' 
    l.state_id 4 
    l.city 'San Francisco' 
    l.location_type_id LocationType::COMMON 
    l.shipper_id 1 
    l.zip 23658 
    end 

risultati in:

trunk>ruby test\unit\location_test.rb 
Loaded suite test/unit/location_test 
Started 
. 
Finished in 0.162 seconds. 

1 tests, 0 assertions, 0 failures, 0 errors 

>ruby test\unit\location_test.rb 
Loaded suite test/unit/location_test 
Started 
E 
Finished in 0.134 seconds. 

    1) Error: 
test_should_require_name_to_save(LocationTest): 
ActiveRecord::RecordInvalid: Validation failed: Name has already been taken 
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/proxy/create.rb:5:in `result' 
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/factory.rb:293:in `run' 
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/factory.rb:237:in `create' 
    test/unit/location_test.rb:18:in `test_should_require_name_to_save' 

1 tests, 0 assertions, 0 failures, 1 errors 

risposta

1

Prima controlla le impostazioni di test per assicurarti che siano ciò che desideri, anche se sospetto che tu possa avere un motivo per non consentire la pratica standard di eseguire un test in una transazione (che viene ripristinata all'uscita).

Le altre opzioni è (1) utilizzare manualmente le operazioni per i test, come quello di cui sopra (dove non c'è già una transazione), più (2) aggiungere un metodo teardown per pulire manualmente le relative tabelle.

+1

Add: self.use_transactional_fixtures = true a questa classe e funziona! Grazie. Sì, ci sono ragioni per cui non posso cambiarlo per l'intero ambiente. Non ho nemmeno pensato di cambiarlo solo per questo test ... doh! Grazie ancora. –

0

Si potrebbe ignorare il metodo setup nel vostro unit test in modo da eliminare i dati che vuoi pulire.

0

Dal momento che tutti i test dovrebbe partire da un database pulito, cercare di ottenere le cose nella vostra base di codice per il punto in cui si può transazioni di utilizzo per ogni test. Di conseguenza, la qualità del tuo test sarà molto migliorata.

Inoltre, questo non è direttamente correlato alla tua domanda ... ma non utilizzare mai proiettori Rails, in nessuna circostanza, per nulla. Usa invece le fabbriche (controlla la gemma factory_girl_rails). Inoltre, controlla RSpec invece di Test :: Unit.

Problemi correlati