使用Devise的可确认模块进行测试(RSpec)

时间:2010-12-13 21:34:53

标签: ruby-on-rails rspec devise

我的理解是Rails的测试环境在每次测试之前被拆除并重建......所以我如何测试需要用户登录的控制器,如果没有Device的可确认模块获取,则无法创建用户在路上?

Devise的recommended method(下面)创建了一个新用户,然后由Devise的confirmable模块发送一封电子邮件。我如何解决这个问题,所以我不是每次都“创造”一个用户...或者如果我是,我可以得到一个对象来测试每个规范的“模拟”新电子邮件?

 before(:each) do
    @user = Factory.create(:user)
    sign_in @user
  end

我确信我忽略了一些非常明显的东西,因为对于任何使用Devise并且可以确认的人来说这一定是一个非常常见的规范......

8 个答案:

答案 0 :(得分:34)

在您的测试环境中,ActionMailer::Base.delivery_method应设置为:test,这意味着这些电子邮件不会被发送出去。如果通过smtp中的配置将此设置设置为其他内容,例如config/environments.rb,则会发送 电子邮件。

如果该设置已经存在,那么要使用User对象(例如,实际上可以登录),您需要在其上调用confirm!

user = User.first
user.confirm!

答案 1 :(得分:17)

获取最新的FactoryGirl版本:

FactoryGirl.define do

  factory :confirmed_user, :parent => :user do
    after(:create) { |user| user.confirm! }
  end

end

答案 2 :(得分:13)

如果您使用factory_girl生成模型,则可以使用after_create确认每个新用户。

Factory.define :confirmed_user, :parent => :user do |f|
  f.after_create { |user| user.confirm! }
end

答案 3 :(得分:6)

今天刚刚提出来:

confirmed_at 7.days.ago

关于你的捏造

答案 4 :(得分:5)

对于Devise 4.2,现在@echo off setlocal EnableDelayedExpansion :: Reset file Type Nul >OnlineServers.txt for /F "delims=" %%a in (servers.txt) do ( ping -n 1 "%%a" >NUL 2>&1 If !errorlevel! equ 0 ( echo %%a Online echo %%a Online>>OnlineServers.txt ) Else ( echo %%a Offline ) ) (不是confirm)。

Source

  

4.2.0 - 2016-07-01

     

删除Devise :: Models :: Confirmable#confirm!方法,改为使用确认。

以下代码还可以防止通过confirm!after(:build)设置after(:create)来生成邮件程序

confirmed_at

答案 5 :(得分:2)

尝试存根active?

@user = Factory.create(:user)
@user.stub(:active?).and_return(true)
sign_in @user

您可能还需要存根confirmed?,我对Devise不太熟悉。

答案 6 :(得分:2)

这个线程已经有一段时间没有看到太多流量了,但是对于现在有这个问题的人来说,您需要做的就是创建一个名为 :confirmed 的 trait 来设置所需的属性,并在您使用它时要创建用户,您将能够使用该用户登录,而无需多次保存用户数据库记录。

  # Use faker library (installed separately) to set realistic seed data
  require 'faker'

  # Factory definition
  factory :user, do
    email { Faker::Internet.unique.email }
    password { Faker::Internet.password(min_length: 12, max_length: 128) }

    trait :confirmed do
      confirmed_at { Time.zone.now }
      confirmation_sent_at { Time.zone.now }
      confirmation_token { '12345' }
    end
  end

  # Example of using it
  user = create(:user, :confirmed)

答案 7 :(得分:1)

制作宝石是

Fabricator(:user) do
  after_build { |user| user.confirm! }
end