2014-02-26 55 views
1

我想測試一個簡單的登錄流程,它需要測試數據庫中存在的用戶。無法創建用戶使用rspec進行水豚測試

describe 'Signin page' do 
    before :each do 
    User.generate(:email => '[email protected]', :password => 'palmdrive', :first_name => 'Automatic', :last_name => 'Tester') 
    end 
    it 'signs in a user', :js => true do 
    signin 
    current_path.should == redirect_path  
    end 
end 

def signin 
    ## Action to sign in the user 
end 

## Use DatabaseCleaner since selenium driver is used 
DatabaseCleaner.strategy = :truncation 

RSpec.configure do |config| 
    config.use_transactional_fixtures = false 
    config.before :each do 
    DatabaseCleaner.start 
    end 
    config.after :each do 
    DatabaseCleaner.clean 
    end 
end 

由於創建用戶的方式稍微複雜一點,所以我定義了User.generate方法來創建用戶。爲了確保它實際工作,在帶有測試環境的rails控制檯上運行,它運行了User.generate(:email => '[email protected]', :password => 'palmdrive', :first_name => 'Automatic', :last_name => 'Tester')它成功地在數據庫中創建了一個用戶。註釋掉之前:每個測試套件都已成功通過。

但問題是運行上面的代碼,測試失敗。這是由於用戶無法在數據庫中創建的。爲什麼User.generate方法不能創建用戶?

回答

2

在spec_helper加:

class ActiveRecord::Base 
    mattr_accessor :shared_connection 
    @@shared_connection = nil 

    def self.connection 
    @@shared_connection || retrieve_connection 
    end 
end 

# Forces all threads to share the same connection. This works on 
# Capybara because it starts the web server in a thread. 
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection 

解決了這個問題。然後不需要使用DatabaseCleaner

0

使用create代替

User.create(:....) 

注意,創建將在數據庫中創建一個記錄。寫入數據庫是一項昂貴的操作,您可能希望在某些情況下避免使用新建而不是創建。

更好的方法是使用工廠。見FactoryGirl https://github.com/thoughtbot/factory_girl

+0

如前所述,創建用戶的機制比User.create複雜,這就是爲什麼我在用戶模型中定義User.generate的原因 –

+0

這取決於您的生成方法是如何實現的。大多數記錄不會被保存/寫入數據庫。你可以通過在對象上調用reload來測試它,並且實際看它是否在那裏。我敢打賭,它不是 – lsaffie

+0

它在那裏。這就是爲什麼如果我首先通過控制檯中的User.generate(..)手動創建用戶,並註釋掉before:每個塊,測試通過 –