我在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
任何想法为什么它不起作用? 感谢。
答案 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回调来设置首次创建用户时的记忆标记