2012-03-29 14 views
10

Naprawdę nie mogę zrozumieć, dlaczego DatabaseCleaner nie czyści mojej testowej bazy danych. Jest to, co otrzymuję monitowaniaOczyszczanie bazy danych RSpec +, niepoprawne czyszczenie

1.9.2p290 :007 > DatabaseCleaner.clean 

-

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

ten nie wydaje się, aby poprawnie ustawić bazę danych (miało być: test), więc mam rozwiązanie jak

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

Klej wydaje się poprawnie skonfigurowany:

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> 

Wygląda na to, że poprawnie skonfigurowano testową bazę danych, jednak nadal nie będzie ona poprawnie czyścić bazy danych. Jakieś sugestie?

Dziękuję bardzo.

+0

Czy konsola w takim otoczeniu? (np. test konsoli szyny) Spodziewam się, że DatabaseCleaner oczyści środowisko, do którego jest wywołane. –

+0

oczywiście. otwarty z _rails c test_. –

+0

z pytaniem 'DatabaseCleaner [: active_record,: connection =>: test] .clean', zwraca zero. –

Odpowiedz

4

Oto mój plik spec_helper.rb (nieznacznie zmodyfikowany) - może to ci pomoże?

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

Strategia skracania nie wymaga DatabaseCleaner.start przed każdym testem. – jeffreymatthias

+0

Dziwnie, kiedy to robię, umieszczam DatabaseCleaner.start w. Przed (: każdy) i .after (: każdy) Jeśli po prostu wstawiam go w po nie zawsze działa. Może to być spowodowane błędami w specyfikacji. – Austio

14

Nawet bazie odkurzacz poprawnie skonfigurowany jest łatwo opuścić dane leżące wokół.

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 

Powyższa konfiguracja rozpoczyna & prowadzi czyszczenia obu stronach każdego badanego.

Jeśli następnie użyć before :all w twoich specyfikacji można skończyć z danych leżące wokół:

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

    ...tests here 
end 
+0

Według specyfikacji Twoja rekomendacja jest oficjalną rekomendacją dla MiniTest, a nie RSpec. https://github.com/DatabaseCleaner/database_cleaner#additional-activerecord-options-for-truncation @palominoz wydaje się odnosić do RSpec. – Sam

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

https://github.com/DatabaseCleaner/database_cleaner

+0

zobacz tę odpowiedź i komentarz autorstwa @mark. przyklej to tam, gdzie chcesz wyczyścić: 'DatabaseCleaner.clean_with (: truncation)' – s2t2