【问题标题】:Accessing a virtual token in tests在测试中访问虚拟令牌
【发布时间】:2016-01-28 19:27:44
【问题描述】:

在 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),如果确实无法访问remember token属性,我想知道如何检查cookies['remember_token']不为零。

虽然夹具没有为用户 michael 定义任何记忆令牌,但 log_in_as 测试助手方法被定义为向 login_path 发布 params[:session] 的正确值,所以我想知道:这些值不是被采用的吗通过会话控制器的创建操作?如果是这种情况,那么创建动作应该和上面描述的真实比赛一样做同样的工作:remember(user) 助手将为用户创建一个remember_token,我们可以检查是否cookies['remember_token'] = user.remember_token

我不明白为什么我们不能访问user.remember_token

【问题讨论】:

    标签: ruby-on-rails railstutorial.org


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 所以如果它是正确的,当用户来自固定装置时调用'user.remember token'没有意义,但是当我们使用assigns(:user)我们访问@user(和@user .remeber_token) 在控制器的创建操作中。
    • @user 是从夹具创建的,而控制器中的 userUser 的独立实例,尽管它们在数据库中的表示是相同的。当调用user.remember 时,它会创建令牌并将其保存在该虚拟属性中。控制器完成后,user 实例和其中的虚拟属性一起消失。然后你回到你的测试,你仍然有@user 实例。但它一开始就没有remember_token 虚拟属性,所以你不能访问它,因为它是nil
    猜你喜欢
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 2013-03-24
    • 2020-08-08
    • 2018-07-23
    • 2021-10-31
    相关资源
    最近更新 更多