Rails Remember_token预计黑色?返回false,返回true

时间:2013-04-30 15:20:35

标签: ruby-on-rails rspec token

我在Hartl Ch。 8 Rails Tutorial和我的测试“记忆令牌”失败了。 错误消息

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

任何想法为什么它不起作用? 感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果你关注Hartl,我相信你真的想要:

class User < ActiveRecord::Base before_create :create_remember_token

  

为了实现这一目标,我们将使用回调创建一个初始令牌,这是在电子邮件唯一性的上下文中第6.2.5节中介绍的一种技术。在那一节中,我们使用了一个before_save回调;这次,我们将使用密切相关的before_create回调来设置首次创建用户时的记忆标记