我在哪里确认用FactoryGirl创建的用户?

时间:2012-08-25 19:35:34

标签: ruby-on-rails rspec factory-bot devise-confirmable

使用rails,devise,rspec& factorygirl:

尝试为我的网站创建一些测试。我正在使用确认模型进行设计,因此当我使用FactoryGirl创建用户时,用户未得到确认。

这是我的个工厂.rb:

FactoryGirl.define do
  factory :user do
    full_name             "Aren Admin"
    email                 "aren@example.com"
    password              "arenaren"
    password_confirmation "arenaren"
    role_id               ADMIN
  end
end

这是我的rspec测试文件:

require 'spec_helper'

describe "Admin pages" do

  subject { page }

  describe "home page" do
    let(:user) { FactoryGirl.create(:user) }
    before { visit admin_home_path }

    it { should have_content("#{ROLE_TYPES[user.role_id]}") }
  end
end

我收到错误,因为用户未得到确认。通过搜索我很确定我需要使用'确认'方法!并且它属于factories.rb文件,但我不知道该放在哪里。

7 个答案:

答案 0 :(得分:34)

您还可以按如下方式设置confirmed_at属性。适合我:

FactoryGirl.define do
  factory :user do
    full_name             "Aren Admin"
    email                 "aren@example.com"
    password              "arenaren"
    password_confirmation "arenaren"
    role_id               ADMIN
    confirmed_at          Time.now
  end
end

答案 1 :(得分:23)

更好的是,执行以下操作(然后您不需要为每个测试套件创建一个前置过滤器)

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

在这里找到: https://stackoverflow.com/a/4770075/1153149

编辑以添加不推荐使用的语法

FactoryGirl.define do |f|
  #Other factory definitions

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

编辑01/27再次更新语法

FactoryGirl.define do
  #Other factory definitions

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

答案 2 :(得分:9)

user.confirm!区块中尝试before

找到here

答案 3 :(得分:2)

这是为我工作的工厂

FactoryGirl.define do
  factory :user do
    sequence :email do |n|
      "address#{n}@example.com"
    end
    sequence :password do |n|
      "password#{n}"
    end

    factory :confirmed_user do
      before(:create) {|user| user.skip_confirmation! }
    end
  end
end

答案 4 :(得分:1)

在工厂定义中添加此行对我有用

before(:create){| user | user.skip_confirmation! }

答案 5 :(得分:1)

将Devise可确认逻辑放入after(:build)回调...

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

对我来说,确认一下!或skip_confirmation!在after(:create)块中导致了email参数的验证错误,但没有用。

答案 6 :(得分:1)

您应该在skip_confirmation!之前致电create,以便用户保留此信息。

before(:create) do |user|
  user.skip_confirmation!
end