2013-04-30 81 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回调来设置用户第一次创建时的记忆标记

相关问题