2

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

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 调用是什么?

4

2 回答 2

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_helper.rb

设置:config.use_transactional_fixtures = false

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

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

rm -f db/test.sqlite3

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

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

于 2014-05-30T01:43:00.397 回答
0

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

于 2014-05-29T03:33:43.797 回答