Rails4.1,设计3.2.4,rspec特性,我如何得到confirmation_token?

时间:2014-05-28 23:56:56

标签: ruby-on-rails ruby rspec devise ruby-on-rails-4.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"
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调用是什么?

2 个答案:

答案 0 :(得分: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

由于我在test-env中使用sqlite,这不是什么大问题。

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

rm -f db / test.sqlite3

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

要做到这一点,我会依赖宝石: https://github.com/bmabey/database_cleaner

答案 1 :(得分:0)

您可以查看可疑模块的Devise test suite,看看他们是如何做到的。您似乎可以致电raw_confirmation_token;我不知道这是否适合你的情况。