【问题标题】:How to correctly use Devise + Confirmable + fixtures如何正确使用 Devise + Confirmable + fixtures
【发布时间】:2017-08-03 19:47:59
【问题描述】:

我使用 Devise + Confirmable 进行用户身份验证,使用 Minitest + Capybara + 固定装置进行测试。只要我在运行前包含某种形式的登录(使用助手login_as(@user) 或使用 Capybara 进入登录页面)和 line@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

【问题讨论】:

  • 所以用户已经创建、保存但尚未确认?您想手动编辑该数据库字段吗?
  • 据我所知,灯具实际上并没有保存到数据库中。当我查看开发数据库中的用户时,两个夹具用户都不在那里。
  • 您好,我更新了我的答案。问题的解决方法是找到听到的。您需要按照指南中的方式配置它并调用方法 user.confirm!模块内部 ControllerMacros 方法 def login_user github.com/plataformatec/devise/wiki/…

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


【解决方案1】:

我更新了我的答案。问题的解决方法是找到听到的。您需要按照指南中的方式配置它并调用方法 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

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

【讨论】:

  • 我认为这是在正确的轨道上,但 dateTime.now 对我不起作用。 DB 是默认的 SQLite 设置。读完这篇文章后,我在设计文档中找到了SQLite should take date('now')。我已经尝试过这种语法,但没有运气。
  • @oneWorkingHeadphone 有一种方法可以确认设计用户.skipconfirmation!。当您使用user = User.new 创建用户时,您调用user.skip_confirmation! 然后保存
  • 这不会将用户数据从夹具中提取出来吗?
  • @oneWorkingHeadphone 对不起。我现在不能回答你。明天我会为您找到解决方案。
  • 感谢您跟进此事!您添加的说明确实有效,但不适用于固定装置 + Minitest(它们适用于 Rspec + FactoryGirl)。最后,我能够使用此 Using Minitest + FactoryGirl 的一个版本来完成这项工作,但从未成功地使其与固定装置一起工作。如果以后有用户偶然发现,我建议你只使用 FactoryGirl 和 Fabrizio 链接到的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多