2014-01-24 75 views
13

我是Rspec和Factory女孩的新手,希望我的測試能夠在特定的數據庫狀態下運行。我知道我可以讓Factory Girl創建這些記錄,並且這些對象在測試運行後會被銷燬,但是如果我在數據庫中有數據會發生什麼。Rspec/FactoryGirl:清理數據庫狀態

例如:我希望我的測試在我通過Factory Girl創建的數據庫中有3條記錄時運行。但是,我目前已經在數據庫中有1個模型記錄,並且我不想僅僅爲了測試而刪除它。在那裏有1個模型會毀掉我的測試。

數據庫內容

[#<Leaderboard id: 1, score: 500, name: "Trudy">] 

leaderboard_spec.rb

require 'spec_helper' 

describe Rom::Leaderboard do 

    describe "poll leaderboard" do 
     it "should say 'Successful Run' when it returns" do 
      FactoryGirl.create(:leaderboard, score: 400, name: "Alice") 
      FactoryGirl.create(:leaderboard, score: 300, name: "Bob") 
      FactoryGirl.create(:leaderboard, score: 200, name: "John") 
      Leaderboard.highest_scorer.name.should == "Alice" 
     end 
    end 

end 

現在我的測試將失敗,因爲它會錯誤地認爲特魯迪是最高的得分手,因爲測試已經在運行錯誤的狀態。

工廠的女孩提供反正從數據庫中刪除記錄,然後回滾此刪除?類似於它如何在數據庫中創建記錄並回滾

回答

33

它很受歡迎使用database_cleaner寶石。你可以在這裏找到它:

https://github.com/bmabey/database_cleaner

文檔建議RSpec的配置如下:

RSpec.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

工廠女孩提供反正從數據庫中刪除記錄,然後回滾此刪除?類似於它在數據庫中創建記錄並回滾 – user2158382

+0

原始問題似乎在問如何保持現有記錄完好。他關於撤消刪除的問題是一個想法,但另一種方法可能是完全避免刪除。 –

+0

巨大的幫助thx這麼多 – austin

0

要儘可能直接回答你的回滾問題:不,沒有辦法在測試中回滾刪除。

遵循測試慣例,您的目標通常是從乾淨的石板開始,並使用factory_girl在數據庫中有效構建需要測試的場景。

可以完成你想要的,例如,加入這個您leaderboards.rb工廠文件:

factory :trudy do 
    id 1 
    score 500 
    name "Trudy" 
end 

或者你可以創建一個在您的測試文件中一個簡單的輔助函數重新生成記錄時它需要測試:

def create_trudy 
    FactoryGirl.create :leaderboard, 
    id: 1, 
    score: 500, 
    name: "Trudy" 
    end 
end 

或者你可以把所有這一切在之前(:套房)描述塊中,像這樣:

describe "with a leaderboard record existing" do 
    before(:each) do 
    FactoryGirl.create :leaderboard, id: 1, score: 500, name: "Trudy" 
    end 
    # Tests with an initial leaderboard record 
end 
describe "with no leaderboard records initially" do 
    # Your test above would go here 
end 

在最後的建議中,您的測試變得非常具有描述性,並且在查看輸出時,您將確切知道每次測試開始時數據庫處於何種狀態。