如何正确使用Devise + Confirmable + fixtures

时间:2017-03-13 17:21:12

标签: ruby-on-rails devise devise-confirmable

我使用Devise + Confirmable进行用户身份验证,使用Minitest + Capybara +灯具进行测试。只要我在运行之前包含某种形式的登录(使用帮助程序login_as(@user)或转到带有Capybara的登录页面)和行@user.confirm,我就可以为用户进行登录测试。

我如何确认灯具本身的用户,所以我不必每次都包括这条线。

现在我有:

confirmed_at: Time.now

在yml中,但它似乎没有什么区别。

这是一个工作样本测试,如果它对插图有用:

def setup
    @user = users(:user)
  end

   test 'user should be redirected to profile edit on first login' do
     @user.confirm
     visit(new_user_session_path)
     fill_in('user_email', :with => @user.email)
     fill_in('user_password', :with => 'foobar')
     click_button('Log in')
     assert_current_path(edit_user_registration_path)
   end

和用户夹具:

user:
  email: test1@example.com
  confirmed_at: Time.now
  encrypted_password: <%= Devise::Encryptor.digest(User, 'foobar') %>
  sign_in_count: 0

1 个答案:

答案 0 :(得分:2)

我更新了我的答案。找到问题的解决方案。您需要在指南中对其进行配置,并调用方法user.confirm!在模块内部ControllerMacros方法def login_user

https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-(and-RSpec)#controller-specs

完整的Devise Rspec项目的开源github页面,包括测试

https://github.com/RailsApps/rails-devise/blob/master/spec/features/users/sign_in_spec.rb

您正在尝试设置

User.confirmed_at = Time.now

confirmed_at至少在我的postegresql数据库中有datetime数据类型,所以这可能取决于您使用的数据库。

confirmed_at: datetime

所以这是Time.now格式

pry(main)> Time.now
=> 2017-03-14 11:14:06 +0100

虽然这是User.confirmed_at格式

user.confirmed_at
=> Sun, 05 Mar 2017 15:05:03 UTC +00:00

因此,您应该使用兼容的格式/变量,尝试在DateTime类中搜索包含UTC的兼容格式DateTime.now返回:

[40] pry(main)> DateTime.now
=> Tue, 14 Mar 2017 11:19:25 +0100

DateTimeutc()方法。如果我运行它几乎是需要的。

DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)).utc

DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)).utc
=> 2005-02-21 16:11:12 UTC

检查DateTime api,如果需要,可以检查github上的utc()方法

DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24))     # => Mon, 21 Feb 2005 10:11:12 -0600
DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)).utc # => Mon, 21 Feb 2005 16:11:12 UTC


# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 168
def utc
  utc = new_offset(0)

  Time.utc(
    utc.year, utc.month, utc.day,
    utc.hour, utc.min, utc.sec + utc.sec_fraction
  )
end

http://api.rubyonrails.org/classes/DateTime.html#method-i-utc