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

Mel*_*emi 29 rspec ruby-on-rails devise

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

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

 before(:each) do
    @user = Factory.create(:user)
    sign_in @user
  end
Run Code Online (Sandbox Code Playgroud)

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

Rya*_*igg 34

在您的测试环境中ActionMailer::Base.delivery_method应该设置为:test,这意味着这些电子邮件不会被发送出去.如果设置为别的东西,如smtp在说一个配置的方式config/environments.rb,那么电子邮件被发送出去.

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

user = User.first
user.confirm!
Run Code Online (Sandbox Code Playgroud)

  • @Meltemi:对,这就是为什么你应该在记录上调用`@ user.confirm!`然后再尝试做任何事情.我会用那个更新我的答案. (4认同)

enr*_*stn 17

最新的FactoryGirl版本:

FactoryGirl.define do

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

end
Run Code Online (Sandbox Code Playgroud)


Rya*_*arn 13

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

Factory.define :confirmed_user, :parent => :user do |f|
  f.after_create { |user| user.confirm! }
end
Run Code Online (Sandbox Code Playgroud)

  • 我相信你会通过添加`confirmed_at Time.now`作为工厂属性来获得相同的效果. (4认同)

fel*_*ero 7

今天它只是放:

confirmed_at 7.days.ago

在你的制作上


Bri*_*oos 6

对于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
Run Code Online (Sandbox Code Playgroud)