2012-03-29 20 views
10

Non riesco davvero a capire perché DatabaseCleaner non pulisce il mio database di test. Questo è ciò che ottengo spingendoRSpec + pulizia del database, pulizia non corretta

1.9.2p290 :007 > DatabaseCleaner.clean 

-

=> [#<DatabaseCleaner::Base:0x007fa7e4dd8b58 @autodetected=true, @orm=:active_record, @strategy=#<DatabaseCleaner::ActiveRecord::Transaction:0x007fa7e4dc14f8 @db=:default>>] 

Questo non sembra per impostare correttamente il database (dovrebbe essere: test), così ho preso una soluzione come

DatabaseCleaner[:active_record, :connection => :test].clean 
# => nil 

La gemma sembra essere impostata correttamente:

1.9.2p290 :007 > DatabaseCleaner[:active_record, :connection => :test] 

#<DatabaseCleaner::Base:0x007fe8fcfd4868 @orm=:active_record, @strategy=#<DatabaseCleaner::ActiveRecord::Transaction:0x007fe8fcfd2748 @db=:test, @connection_hash={"adapter"=>"sqlite3", "database"=>"db/test.sqlite3", "pool"=>5, "timeout"=>5000}>, @db=:test> 

Sembra impostare correttamente il database di test, tuttavia non ha ancora intenzione di pulire correttamente il database. Eventuali suggerimenti?

Grazie mille.

+0

è la vostra console in un ambiente analogo? (es. test console rails) Mi aspetterei che DatabaseCleaner pulisca l'ambiente in cui è chiamato. –

+0

ovviamente lo è. aperto con _rails c test_. –

+0

prompt 'DatabaseCleaner [: active_record,: connection =>: test] .clean', restituisce nil. –

risposta

4

Ecco il mio spec_helper.rb (leggermente modificato) - forse questo ti aiuterà?

ENV["RAILS_ENV"] ||= 'test' 
require File.expand_path("../../config/environment", __FILE__) 
require 'rspec/rails' 
require 'database_cleaner' 

RSpec.configure do |config| 
    config.before(:suite) do 
    DatabaseCleaner.strategy = :truncation 
    end 
    config.before(:each) do 
    DatabaseCleaner.start 
    end 
    config.after(:each) do 
    DatabaseCleaner.clean 
    end 
end 
+1

La strategia di troncamento non richiede DatabaseCleaner.start prima di ogni test. – jeffreymatthias

+0

Stranamente, quando lo faccio metto DatabaseCleaner.start in .before (: each) e .after (: each) Se lo metto appena dopo, non sempre viene eseguito. Ciò potrebbe essere dovuto ad errori in una specifica. – Austio

14

Anche con il database configurato pulito correttamente è facile lasciare i dati in giro.

config.before(:suite) do 
    DatabaseCleaner.clean_with :truncation # clean DB of any leftover data 
    DatabaseCleaner.strategy = :transaction # rollback transactions between each test 
    Rails.application.load_seed # (optional) seed DB 
end 

config.before(:each) do 
    DatabaseCleaner.start 
end 

config.after(:each) do 
    DatabaseCleaner.clean 
end 

La configurazione sopra inizia & corre il pulitore entrambi i lati di ogni prova.

Se quindi si utilizza before :all nelle specifiche si può finire con i dati in giro:

describe User do 
    # Before all is outside the before :each 
    before :all do 
    @user = User.create(:email => '[email protected]') 
    end 

    ...tests here 
end 
+0

Secondo le specifiche, la tua raccomandazione è la raccomandazione ufficiale per MiniTest, non per RSpec. https://github.com/DatabaseCleaner/database_cleaner#additional-activerecord-options-for-truncation @palominoz sembra riferirsi a RSpec. – Sam

1
$ rails c test 
> require 'database_cleaner' 
> DatabaseCleaner.strategy = :truncation 
> DatabaseCleaner.clean 

https://github.com/DatabaseCleaner/database_cleaner

+0

vedere questa risposta e commento da @mark. incollalo dove vuoi pulire: 'DatabaseCleaner.clean_with (: truncation)' – s2t2