2011-06-01 126 views
2

我想在我們的Ruby on Rails系統中測試一個案例,我們在x次失敗的登錄嘗試後鎖定用戶。我遇到的問題是試圖創建一個用戶已達到'鎖定'他的帳戶的號碼。我正在使用工廠來創建一個像這樣的用戶 -Rspec工廠問題 - 概念性問題?

Factory.define :locked_user, :class => User do |user| 
user.name     "Test Lock" 
user.email     "[email protected]" 
user.password    "blah1234" 
user.password_confirmation "blah1234" 
user.login_count    5 
end 

其中5是'魔術數字'。當我嘗試使用類似

@user = Factory(:locked_user) 

它創建的數據庫 - 但新創建的用戶總是有login_count設置爲零用戶,所以它只是記錄了他在測試中。當我嘗試像這樣

@user = Factory.build(:locked_user) 

的.build方法它設置用戶與login_count = 5像我想要的,但後來並沒有看到用戶爲有效,並不會嘗試登錄他們(即它給了我們'錯誤的用戶/密碼'錯誤,而不是'正確的用戶/密碼,但你被鎖定'錯誤)。我想我在這裏錯過了一些東西,讓RSpec拿起事實,這是有效的用戶,但帳戶應該被鎖定。有人可以幫助我設定好嗎?下面是整個desribe塊級

describe "with locked account" do 
    before(:each) do 
     @user = Factory.build(:locked_user) 
     @attr = { :email => @user.email, :password => @user.password} 
    end 

    it "should not allow signin with locked account" do 
    post :create, :session => @attr 
    flash.now[:error].should =~ /Invalid user locked out/i 
    end 
end 

回答

0

我會建議你要麼設置login_count創建用戶後,或存根告訴你,如果一個用戶登錄被鎖定的方法。

例如,使用update_attribute迫使login_count用戶創建後:

before(:each) do 
    @user = Factory(:user) 
    @user.update_attribute(:login_count, 5) 
    @attr = { :email => @user.email, :password => @user.password} 
end 

或者使用存根存根出locked_login?或等效的方法:

before(:each) do 
    @user = Factory(:user) 
    @user.stub(:locked_login?).and_return(true) 
    @attr = { :email => @user.email, :password => @user.password} 
end 
+0

我嘗試使用.update_attribute方法(根據我們的計劃實現情況更有意義),但它仍認爲last_login值是0,即使我給它新的值。有任何想法嗎? – Will 2011-06-01 17:35:35

+0

這是一個執行錯誤。你可能有一些after_save或before_save鉤子覆蓋該值並將其設置爲0.我建議在繼續進行其餘的測試之前,先調試單個update_attribute行 - 編寫一些單元測試並首先解決該問題。 – 2011-06-01 18:05:31

+0

好的,謝謝指點 - 非常感謝! – Will 2011-06-01 18:14:59