在测试中访问虚拟令牌

时间:2016-01-28 19:27:45

标签: ruby-on-rails railstutorial.org

在Rails教程第8章中,测试了“记住我'复选框正在运行。

在真实的比赛中,如果用户检查“记得我”。登录页面中的复选框,登录后,会话控制器的创建操作使用remember(user)帮助程序,为用户创建remember_token并更新用户模型中的remember_digest属性(通过user.rb中的remember方法,然后设置cookies[:user_id] = user.idcookies[: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

1 个答案:

答案 0 :(得分:1)

@user是通过夹具创建的。问题是,#remember_token是一个虚拟属性,这意味着它不会映射到数据库列。它仅在#remember实例上调用User函数时才会被设置,当该实例死亡时,它会随之消失(尽管它的摘要保存在数据库中,并且加密版本为它保存在用户的cookie中。)

您使用#log_in_as在那里做的是,首先创建一个User,然后在#log_in_as中获取该用户的电子邮件地址和密码,并将其发送到控制器。控制器使用您提供的电子邮件从数据库中找到该用户,然后继续调用该实例上的#remember函数。

如您所见,#remember实例上从未调用@user函数,因此它从未收到remember_token。但是通过该控制器操作,设置了cookie并在数据库中保存了摘要。因此,您测试的是检查cookie是否已设置。

如果你想要更加细致,我想你可以做的另一件事是检查cookie的摘要是否与数据库中的摘要相同。