2011-03-11 61 views
4

我正在關注Michael Hartl的Ruby on Rails教程(railstutorial.org)。config.cache_classes = false搞砸了rspec測試?

在某些時候,我厭倦了測試失敗,因爲測試使用了舊的緩存版本的類,所以我關閉了測試環境中的config.cache_classes。這解決了這個問題,一切都很順利。

直到我嘗試在第8.4.3章中實現集成測試。此時的數據輸入到數據庫與

it "should make a new user" do 
    lambda do 
     visit signup_path 
     fill_in "Name",   :with => "Example User" 
     fill_in "Email",  :with => "[email protected]" 
     fill_in "Password",  :with => "foobar" 
     fill_in "Confirmation", :with => "foobar" 
     click_button 
     response.should have_selector("div.flash.success", 
            :content => "Welcome") 
     response.should render_template('users/show') 
    end.should change(User, :count).by(1) 
    end 

將繼續留在每次測試後的數據庫,所以僅在第一次這個測試運行它會工作,之後,它總是失敗,直到我手動清空數據庫。 除此之外,它的工作。 但現在在第9章,再集成測試失敗:

describe "when signed in" do 

before(:each) do 
    @user = Factory(:user) 
    visit signin_path 
    fill_in :email, :with => @user.email 
    fill_in :password, :with => @user.password 
    click_button 
end 

it "should have a signout link" do 
    visit root_path 
    response.should have_selector("a", :href => signout_path, 
            :content => "Sign out") 
end 

這一次,它只是不工作,用戶不獲取登錄和結果頁面沒有退出鏈接,只是正常的跡象在鏈接。 當在網頁瀏覽器中測試它時,它工作正常。

花了我幾個小時和幾天的時間搜索互聯網並測試不同的東西,最後我找到了解決方案:重新開啓config.cache_classes。 現在它完美地工作。

那麼任何人都可以向我解釋爲什麼config.cache_classes使測試失敗?我怎樣才能關閉緩存而不會搞亂我的測試?

由於事先

最好的問候,托比亞斯

回答

1

我有完全相同的問題和你一樣設置config.cache_classes到真正的解決了這個問題。但是,在測試環境中緩存類並不是你想要的,我不認爲。我當然不明白爲什麼緩存類讓測試通過。

所以我發現解決這個問題的方法是安裝一個數據庫清理作爲測試失敗的原因是由於測試數據庫中的條目重複。 https://github.com/bmabey/database_cleaner

然後在你的Gemfile,你試驗組添加此。

gem 'database_cleaner', '0.6.6' 

然後運行「包安裝」,安裝這種寶石

那麼......你spec_helper.rb文件,添加這個..

RSpec.configure do |config| 
. 
. 
. 
. 
    config.before(:each) do 
     DatabaseCleaner.strategy = :truncation 
     DatabaseCleaner.clean 
    end 

之前,這將清除您的測試數據庫每次運行您的rspec測試。

希望這會有所幫助。 乾杯, 馬克。

1

當您撥打水豚電話時,它會使用機架測試來模擬對Rails應用程序的調用。每次調用完成後,它都會重新加載所有的rails類。這意味着您在調用「訪問signin_path」之前創建的@user對象將被清空,因爲所有ActiveRecord對象都已重新加載。

當您將cache-classes設置爲true時,它會告知Rack不要在每個請求上重新加載ActiveRecord對象,以便您的測試再次通過。

我相信,如果你想你上面寫的傳遞沒有打開緩存類的測試,你應該移動「@user =廠(:用戶)」的「訪問signin_path」線下線上。