2013-04-30 82 views
1

我在Hartl Ch。 8 Rails教程和我的測試「記憶令牌」失敗。 錯誤消息Rails Remember_token預計黑色?返回false,返回true

User remember token 
Failure/Error: it { @user.remember_token.should_not be_blank} 
expected black? to return false, got true 

測試代碼

describe "remember token" do 
    before { @user.save } 
    it { @user.remember_token.should_not be_blank } 
    end 

模型方法

def create_remember_token 
    self.remember_token = SecureRandom.urlsafe_base64 
    end 

任何想法,爲什麼它不工作? 謝謝。

+0

您能粘貼所有的模型代碼嗎? – 2013-04-30 15:36:37

+0

你在哪裏調用你的create_remember_token方法?你可以在before_save鉤子中做這個例子。 before_save:create_remember_token – Mindbreaker 2013-04-30 15:41:46

回答

3

不知道如何設置模型的其餘部分,或者如果這應該只發生一次或每次保存時,設計可能會更改。這將取決於你如何設置掛鉤,其中調用create_remember_token

假設,你總是希望確保令牌存在,你可以強制,如果之前您節省:

class User < ActiveRecord::Base 
    before_save :create_remember_token 

    # Rest of code 

    def create_remember_token 
    # Only create this if it doesn't already exist 
    self.remember_token = SecureRandom.urlsafe_base64 unless remember_token 
    end 
end 

爲了更準確的測試,我會用:

describe User do 

    subject(:user) { User.new } # Omitting required attributes 

    context "on saving" do 
    it do 
     SecureRandom.stub(urlsafe_base64: "test_token") 

     expect{user.save}.to change{user.remember_token}.from(nil).to("test_token") 
    end 
    end 

end 
+0

非常感謝!是我的錯 - 我忘了'before_save:create_remember_token'。現在它工作了! – 2013-05-01 15:08:54

0

如果您「再下面Hartl的,我相信你真的想:

class User < ActiveRecord::Base before_create :create_remember_token

爲了達到這個目的,我們將使用回調創建一個初始令牌,這是一個在6.2.5節中介紹的電子郵件唯一性技術。在那一節中,我們使用了before_save回調;這次我們將使用緊密相關的before_create回調來設置用戶第一次創建時的記憶標記

相關問題