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

我的理解是Rails的测试环境在每次测试之前被拆除并重建……所以我如何测试一个控制器,该控制器要求用户登录并且如果没有Device的可确认模块阻碍,则无法创建用户?

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

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

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

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

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

 user = User.first user.confirm! 

最新的FactoryGirl版本:

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

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

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

今天它只是放:

confirmed_at 7.days.ago

在你的制作上

对于Devise 4.2,现在confirm (不confirm! )。

资源

4.2.0 – 2016-07-01

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

由于after(:build) vs after(:create)设置confirmed_at下面的代码也会阻止生成邮件程序

 FactoryGirl.define do factory :user do after(:build) { |u| u.skip_confirmation_notification! } after(:create) { |u| u.confirm } ... end end 

尝试存根active?

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

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

对于制造gem来说

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