2009-12-14 62 views
13

我使用seeds.rb填充某些國家模型參考數據:防止Rails的測試

State.create :name => 'Alabama', :abbreviation => 'AL' 
State.create :name => 'Alaska', :abbreviation => 'AK' 
# ... 

雖然我不使用狀態固定裝置(因爲它的種子數據,首先,我認爲這不需要DRY來完全複製這個測試),Rails測試框架似乎在測試過程中刪除了所有狀態種子數據。 (我正在刪除,重新創建,遷移和重新生成測試數據庫,並且確認數據在單元測試運行之前已經存在。)

結果是此斷言在seeds.rb中成功,但在單行測試中失敗:

assert_equal 51, State.all.size 

1) Failure: 
test_state_seeds_are_present(StateTest) [/test/unit/state_test.rb:24]: 
<51> expected but was 
<0>. 
1 tests, 1 assertions, 1 failures, 0 errors 

我試圖在基礎測試類燈具聲明都明確列出非國家模型,以及翻轉事務燈具標誌(如預期,這隻會影響在測試過程中創建的記錄)。自然,考慮中的測試本身並不會刪除這些記錄。

狀態記錄總是被刪除。有沒有辦法告訴Rails從種子數據中脫穎而出?我是否需要複製裝置中的所有數據以確保重新裝載?由於沒有發生重大政治事件,我預計國家數據會相對穩定。

TIA

+0

謝謝你們,我會盡量都盧克的(一次性)和weppos'(在設置)建議爲明確加載種子測試中的數據並查看哪一個最適合我的目的。我會把它看作是一個測試只會首先覈實數據庫數據。 – aaron

回答

12

測試從數據庫中刪除所有數據,然後加載您的燈具(如果您有任何)。

您需要讓測試助手在測試運行之前加載種子文件。有幾個方法可以做到這一點,看看我的類似的問題:How to load db:seed data into test database automatically?

最簡單的方法可能只是爲了

require "#{Rails.root}/db/seeds.rb"

添加到您的test_helper.rb中文件的頂部(假設你使用內置的測試框架)。

+1

這對我不起作用,如果我將該行添加到我的夾具中,它工作正常,但是如果我將它放在test_helper.rb中,種子數據在我的測試達到之前似乎已經消失。 – dangerousdave

+3

您是否有固定的yml文件供您嘗試在種子文件中填充的類使用?因爲這會在燈具運行時吹走所有數據。刪除種子的夾具文件;或者如果你不能這樣做,那就使用Simone的例子,在每次測試之前加載夾具數據。 –

+0

啊,我已經註釋掉了我的.yml文件,但是這似乎還不夠,它的存在會導致種子數據被覆蓋。刪除它,一切都很好,謝謝你的幫助盧克 – dangerousdave

4

「種子」功能沒有集成到測試架構中。測試是圍繞燈具構建的,每次運行測試套件時,Rails都會從燈具加載數據並替換現有內容。

但是,使用種子數據填充數據庫非常簡單。

在您的test_helper.rb文件中,在基類ActionSupport::TestCase類中添加一個新的設置方法。

class ActionSupport::TestCase < ... 

    setup :load_seeds 

    protected 

    def load_seeds 
     load "#{Rails.root}/db/seeds.rb" 
    end 

end 
+0

這將在每個測試用例之前重新載入您的種子數據,這些測試用例可能不需要做交易裝置。只要種子數據應該保持不變(它應該),你只需要加載它一次。 –

+0

這就是我認爲的盧克,但無論如何,它似乎被刪除,所以它聽起來像我將不得不實施某種解決方法,以確保它存在於測試數據庫。 – aaron

+1

你的fixtures目錄中是否有state.yml文件?即使它是空的,它也會導致你的狀態數據被刪除。我總是確保刪除我的種子數據表中的燈具(實際上我不再使用燈具,但這是另一回事)。 –

0

我同意weppos爲做到這一點的最好辦法,但爲了完整起見,併爲人民着想誰可能已經有測試數據中可以採取其他辦法,從種子數據庫現有的裝置。

這是通過做這樣的事情在db/seeds.rb文件中的下列完成

RAILS_FIXTURES = "#{Rails.root}/spec/fixtures" 

models_loaded_from_fixtures = %w[Modela Modelb Modelc ....] 

models_loaded_from_fixtures.each do |model| 
    Fixtures.create_fixtures(RAILS_FIXTURES, "#{model.tableize}") 
    puts "Loaded #{model.constantize.all.size} #{model.pluralize}" 
end 

你可以交替閱讀fixures目錄,並創建文件名的數組來處理,我選擇了上述過程因爲我希望能夠指定我希望給DB帶來多少現有固定裝置中的哪一個。

0

我質疑首先需要寫這樣的測試。您是否測試了種子數據耙子任務是否正常工作,或者您是否想測試您的State類實現的行爲?我假設後者,所以我會編寫關注行爲的測試,並使用Factory Girl(或類似的),因爲您提到您不使用燈具。請務必從test/test_helper.rb中刪除fixtures :all行。

爲了注射任務進入運行測試的正常流動,這是一個辦法,一直爲我工作:

namespace :test do 
    task :force_environment do 
    ENV['RAILS_ENV'] = 'test' 
    RAILS_ENV.replace('test') 
    end 
end 

%w(test:units test:functionals test:integration).map do |task_name| 
    task = Rake::Task[task_name] 
    task.clear_prerequisites 

    task.enhance %w(db:test:prepare test:force_environment db:seed) 
end 

只要把在一個名爲lib/tasks/testing.rake,它會得到回升,當你接下來運行rake test或其他測試相關的任務。

+0

嗨,帕特里克。實際上我不需要測試狀態模型本身,這只是一個示例,說明種子數據不存在。狀態模型(參考數據)用於驗證地址,地址驗證測試失敗,因爲狀態數據不在數據庫中。 – aaron

+0

這樣做更有意義。 Rake任務應該爲你工作,但聽起來像你有事情的工作。 –

0

我有同樣的問題,但標準答案不適用於我。

我的問題涉及的地方在類文件做了常量和named_scopes的數據庫查找。我無法找到任何方法在正確的時間加載種子數據。

我確實找到了一種旁路刪除的方法,即使我已經刪除了缺少的表的夾具文件,這種情況也發生了。

RAILS_ENV =測試耙分貝:種子 紅寶石-Itest測試/單位/ * RB

相關問題