1

我在 Hartl Ch. 8 Rails 教程和我的测试“记住令牌”失败。错误信息

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

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

4

2 回答 2

3

在不知道如何设置模型的其余部分,或者如果这只发生一次或每次保存时,设计可能会发生变化。这将取决于您如何设置调用create_remember_token.

假设您总是希望确保令牌存在,您可以在保存之前强制执行 if:

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
于 2013-04-30T15:42:21.287 回答
0

如果您关注 Hartl,我相信您确实想要:

class User < ActiveRecord::Base before_create :create_remember_token

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

于 2014-06-23T18:13:20.280 回答