在Rails教程第8章中,测试了“记住我'复选框正在运行。
在真实的比赛中,如果用户检查“记得我”。登录页面中的复选框,登录后,会话控制器的创建操作使用remember(user)
帮助程序,为用户创建remember_token
并更新用户模型中的remember_digest
属性(通过user.rb中的remember
方法,然后设置cookies[:user_id] = user.id
和cookies[:remember_token] = user.remember_token
。
本书说,在测试中,理想情况下,我们会检查cookie的值是否等于用户的记忆令牌,但是按照目前的设计,测试无法访问它:用户变量在控制器中有一个记忆令牌属性,但是(因为remember_token是虚拟的)测试中的@user变量不是"。
测试定义如下:
def setup
@user = users(:michael)
end
test "login with remembering" do
log_in_as(@user, remember_me: '1')
assert_not_nil cookies['remember_token']
end
首先,考虑如何定义cookies['remember_token']
(cookies[:remember_token] = user.remember_token
),如果我们无法访问记忆令牌属性,我想知道如何检查cookies['remember_token']
是否为log_in_as
不是。
虽然灯具没有为用户michael定义任何记忆标记,但是remember(user)
测试助手方法被定义为将params [:session]的login_path发布到正确的值,所以我想知道:aren'会话控制器的创建操作采取的这些值?如果是这种情况,则创建操作应该执行与上述真实竞赛相同的工作:remember_token
帮助程序将为用户创建cookies['remember_token'] = user.remember_token
,我们可以检查是否{{1} }。
我不明白为什么我们无法访问user.remember_token
。
答案 0 :(得分:1)
@user
是通过夹具创建的。问题是,#remember_token
是一个虚拟属性,这意味着它不会映射到数据库列。它仅在#remember
实例上调用User
函数时才会被设置,当该实例死亡时,它会随之消失(尽管它的摘要保存在数据库中,并且加密版本为它保存在用户的cookie中。)
您使用#log_in_as
在那里做的是,首先创建一个User
,然后在#log_in_as
中获取该用户的电子邮件地址和密码,并将其发送到控制器。控制器使用您提供的电子邮件从数据库中找到该用户,然后继续调用该实例上的#remember
函数。
如您所见,#remember
实例上从未调用@user
函数,因此它从未收到remember_token
。但是通过该控制器操作,设置了cookie并在数据库中保存了摘要。因此,您测试的是检查cookie是否已设置。
如果你想要更加细致,我想你可以做的另一件事是检查cookie的摘要是否与数据库中的摘要相同。