【问题标题】:Rails4.1, devise 3.2.4, rspec feature, How I get confirmation_token?Rails4.1,设计 3.2.4,rspec 功能,我如何获得确认令牌?
【发布时间】:2014-05-28 23:56:55
【问题描述】:

我正在尝试使用以下步骤编写功能规范:

visit "/users/sign_up"
fill_in 'user_email', :with => 'dan@dan.net'
fill_in 'user_password', :with => 'abc123'
fill_in 'user_password_confirmation', :with => 'abc123'
click_button "Sign up"
dan_confirmation_token = get_confirmation_token
visit "/users/confirmation?confirmation_token=#{dan_confirmation_token}"

在以前的设计版本中, 我可以直接从以下位置获取 dan_confirmation_token:

User.find_by_email('dan@dan.net').confirmation_token

但是现在设计更安全了。

我用来获取 dan_confirmation_token 的 API 调用是什么?

【问题讨论】:

标签: ruby-on-rails ruby rspec devise ruby-on-rails-4.1


【解决方案1】:

我得到了这个工作:

visit "/users/sign_up"
fill_in 'user_email', :with => 'dan@dan.net'
fill_in 'user_password', :with => 'abc123'
fill_in 'user_password_confirmation', :with => 'abc123'
click_button "Sign up"
visit "/"
usr = User.find_by_email "dan@dan.net"
raw, enc = Devise.token_generator.generate(usr.class, :confirmation_token)
usr.confirmation_token = enc
usr.confirmation_sent_at = Time.now.utc
usr.save(validate: false)
visit "/users/confirmation?confirmation_token=#{raw}"

我应该注意 usr.save(validate: false) 不会像我想要的那样工作,除非我配置 rspec 以避免使用事务:

vi spec/spec_helper.rb

设置: config.use_transactional_fixtures = false

由于我在我的测试环境中使用 sqlite,这没什么大不了的。

在每次测试运行结束时,我都会这样做:

rm -f db/test.sqlite3

如果我想使用 Postgres 运行我的测试,我需要在每次测试运行后“清理我的数据库”。

为此,我将依赖 gem: https://github.com/bmabey/database_cleaner

【讨论】:

    【解决方案2】:

    您可以查看 Confirmable 模块的 Devise test suite 以了解他们是如何做到的。看来你可以打电话给raw_confirmation_token;我不知道这是否适合你的情况。

    【讨论】:

    • 我确实看到了。我试过这个:raw = user.raw_confirmation_token NoMethodError Exception: undefined method `raw_confirmation_token' for #<0x007f194c12f5e0>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多