2011-02-01 101 views
4

我正在運行rails 3.0.3,並使用帶有postgresql數據庫的rspec-rails 2.4.1。每當我運行我的RSpec測試時,數據仍然在最後。有誰知道如何讓rails或rspec在每次使用之間擦除測試環境的數據?rails測試數據庫不會擦除

請告訴我,如果有任何進一步的信息可以使我的問題更容易回答。

謝謝!
Tristan

+0

我相信在你運行測試之前數據已經被清除了,而不是之後。 – cam 2011-02-01 23:10:08

+0

嘿凸輪。對不起,這可能是正確的,但現在都沒有發生。 – WoodenKitty 2011-02-03 05:17:42

回答

10

安裝database_cleaner gem,然後將其添加到您的spec_helper.rb。每次測試運行

RSpec.configure do |config| 
    config.use_transactional_examples = true 
end 
+0

嘿謝謝鮑比。默認情況下,每次運行rspec時測試數據庫不應該是空的? – WoodenKitty 2011-02-02 02:42:43

5

使用事務的例子來回滾數據,我只是把我自己通過,使用了錯誤before塊。

我意外地設置before塊作爲all代替each

before :all do 
    user = FactoryGirl.create(:user) 
    sign_in user 
end 

這導致user留下來在數據庫中爲整個rspec運行,這引起驗證碰撞。

相反,before應該是一個each讓一切都通過rspec運行保持清潔:

before :each do 
    user = FactoryGirl.create(:user) 
    sign_in user 
end 

如果你犯了這個錯誤,那麼你可能需要手動清理你的測試數據庫在事情恢復正常之前。最簡單的方法是截斷每個表(除了schema_migrations)。

0

另一種可能性後

Spec::Runner.configure do |config| 

    config.before(:suite) do 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner.clean_with(:truncation) 
    end 

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

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

end 
0

您不需要任何額外的寶石來清理運行之間的測試數據庫。在你的spec_helper.rb文件中,按如下方式配置rspec:

RSpec.configure do |c| 
    c.around(:each) do |example| 
    ActiveRecord::Base.connection.transaction do 
     example.run 
     raise ActiveRecord::Rollback 
    end 
    end 
end