【问题标题】:Devise testing expired reset token设计测试过期的重置令牌
【发布时间】:2018-07-26 18:21:36
【问题描述】:

我需要一些帮助

我正在测试过期的reset_password_token 是否应该更新用户帐户。我将User 模型中的reset_password_sent_at 属性设置为过期值,但无论如何用户的密码都已更新。我正在使用 Devise 的可恢复模块。

工厂/用户.rb

factory :user_expired_unconfirmed_password do
  email { Faker::Internet.email }
  password { default_password }
  password_confirmation { default_password }
  confirmed_at { 2.days.ago }
  reset_password_token { nil }
  reset_password_sent_at { nil }
  updated_at { 2.hours.ago }
end

passwords_spec.rb

RSpec.describe Devise::PasswordsController, type: :request do
  it "creater users with expired reset_password_token (6 hours max.) shouldn't update password" do
    user = FactoryBot.create(:user_expired_unconfirmed_password)
    reset_password_token = user.send_reset_password_instructions

    old_passw = user.encrypted_password
    new_passw = 'test_new_passw_123'

    # expire token
    user.reset_password_sent_at = 7.hours.ago

    #### debbug ###
    # user.reload # if uncommented, got true in the below line
    puts user.reset_password_period_valid? # got false

    put user_password_path,
      :params => {
        "user" => {
          "reset_password_token" => reset_password_token,
          "password" => new_passw,
          "password_confirmation" => new_passw
        }
      }

    expect(user.reload.encrypted_password).to eq old_passw # got false here
  end
end

P.s:使用方法 reset_password_period_valid? 如果我重新加载用户,我得到了 falsetrue,但独立于此,它没有通过断言。

知道会是什么吗?我在模型测试中使用有效和过期reset_password_token 测试了这些帮助程序方法以更改密码并且它工作正常。

【问题讨论】:

  • 我认为这是因为您在修改 reset_password_sent_at 后从未真正保存用户。 (这是user.reset_password_period_valid? 在重新加载用户后提供truefalse 的方式)。我认为 Devise 在其控制器操作中执行查询以通过 reset_password_token 检索用户(因此他们也会像在您的测试中一样执行“重新加载”),并且由于 reset_password_sent_at 的值没有保存它是有效的并更新了密码

标签: ruby-on-rails devise factory-bot rspec-rails


【解决方案1】:

尝试使用 reset_password_token 的新值保存用户

RSpec.describe Devise::PasswordsController, type: :request do
  it "creater users with expired reset_password_token (6 hours max.) shouldn't update password" do
    user = FactoryBot.create(:user_expired_unconfirmed_password)
    reset_password_token = user.send_reset_password_instructions

    # expire token
    user.reset_password_sent_at = 7.hours.ago
    user.save

    #### debbug ###
    user.reload
    puts user.reset_password_period_valid? # You should get false

    old_passw = user.encrypted_password
    new_passw = 'test_new_passw_123'

    put user_password_path,
      :params => {
        "user" => {
          "reset_password_token" => reset_password_token,
          "password" => new_passw,
          "password_confirmation" => new_passw
        }
      }

    expect(user.reload.encrypted_password).to eq old_passw # got false here
   end
end

【讨论】:

  • 我稍后会尝试并在此处发布反馈。谢谢!
  • 有效!不错的收获!我认为reload 就足够了,显然不是。感谢您的帮助!
猜你喜欢
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 2013-03-24
  • 2020-06-03
  • 2016-02-22
  • 1970-01-01
相关资源
最近更新 更多