2011-07-11 397 views
4

有沒有辦法阻止Rails在運行測試之前清除測試數據庫?我想使用我的生產數據庫的副本進行測試,因此我需要防止rails每次清除數據。Ruby on Rails - 測試數據庫

有相當多的數據,所以我想盡可能避免使用燈具,因爲我假設每次都需要很長時間來填充數據庫。

謝謝, 邁克

+1

測試的關鍵在於讓數據庫充滿可預測的數據,這些數據不會因一次測試而改變。通過使用生產數據,您將失去這一優勢。我真的會考慮用'FactoryGirl'來爲你模擬數據庫數據。 – iwasrobbed

回答

0

讓我說你一般不希望使用生產數據進行測試前言本。這就是說...

你可以加載「種子」數據,但確保你沒有任何固定裝置,否則它會被刪除,每次測試運行。

查看this answer瞭解如何自動生成數據。

6

您可以通過運行測試,避免手動

ruby -Itest test/unit/some_test.rb 

這是耙的任務,做測試分貝娛樂(你可以手動像這樣運行它)

rake db:test:prepare 

但我的建議是你做錯了。 測試中的一般想法是,您知道數據庫的狀態,因此知道對函數的期望。

例如。

test "search_by_name" do 
    expected = User.all.select{|u| u.name =~ /arthur/i} 
    assert_equal expected, User.search_by_name("Arthur") 
end 

是一個很好的測試 但是,如果你不知道該數據庫的狀態,你怎麼知道有一個阿瑟?

上面的測試會通過三種不好的情況;

  1. 沒有用戶記錄
  2. 所有的用戶稱爲「亞瑟」
  3. 沒有用戶叫阿瑟。

所以它更好地創建一個虛假的現實, 我們知道數據庫的狀態。

我們想;

  1. 至少一個具有名稱「亞瑟」名稱爲「亞瑟」
  2. 至少一個用戶爲另一單詞
  3. 至少一個非用戶亞瑟的一部分用戶。

更好的測試,假設db是空的,並且使用factory girl,可能是。

test "search_by_name" do 
    expected = [ 
    Factory.create(:user, :name => "Arthur"), 
    Factory.create(:user, :name => "MacArthur") 
    ] 
    not_expected = [Factory.create(:user, :name => "Archer")] 
    assert_equal expected, User.search_by_name("Arthur") 
end 
+0

這沒有奏效。 ruby -Itest ...命令刪除了我的表中的數據。架構保持不變,但數據已被刪除。但是,關於已知數據的觀點很好。我現在正在使用測試進行用戶界面驗證,因此我想使用生產數據,以便查看(並測試)用戶看到的內容。但更好的辦法可能是獲得我需要的表格,創建固定裝置/種子並以這種方式進行。謝謝你的回答,我很感激 – hoitomt