我使用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
答案 0 :(得分:2)
我更新了我的答案。找到问题的解决方案。您需要在指南中对其进行配置,并调用方法user.confirm!在模块内部ControllerMacros方法def login_user
完整的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
DateTime
有utc()
方法。如果我运行它几乎是需要的。
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