【问题标题】:Where do I confirm user created with FactoryGirl?我在哪里确认使用 FactoryGirl 创建的用户?
【发布时间】:2023-04-09 11:00:01
【问题描述】:

使用 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

由于未确认用户,我收到错误消息。通过四处搜索,我很确定我需要使用“确认!”的方法。并且它属于 factory.rb 文件,但我不知道放在哪里。

【问题讨论】:

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


    【解决方案1】:

    您也可以按如下方式设置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
    

    【讨论】:

    • 比起confirm!,我更喜欢这种方法,因为它少了一个操作。
    • 用一行替换了两行......而且更直观一点,imo。谢谢!
    • 这是最干净的方法。谢谢:+1:
    • 请注意,Time.now 将在定义工厂时执行,而不是在创建用户对象时执行。建议在创建时传递confirmed_at { Time.now } 之类的块来设置confirmed_at
    【解决方案2】:

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

    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
    

    【讨论】:

    • 嗨!我用过你的方法,上面写着 > undefined method after_create。这是为什么呢?
    • 我需要更多信息,它试图在什么对象上运行 after_create?这可能是从一个旧答案中提取的。我认为 Factory.define 语法可能会被贬低。我将使用最新的语法编辑我的答案。如果这不起作用,请告诉我。
    • 这是一个很好的答案,也是我通常使用的……除了 ThoughtBot 再次更改了语法(我们还在那里吗?)。应该是after(:create) {...etc
    【解决方案3】:

    在您的 before 块中尝试 user.confirm!

    找到here

    【讨论】:

    • 您的链接已过时。它是哪个“之前”块?能给我们举个例子吗?
    【解决方案4】:

    这是为我工作的工厂

    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
    

    【讨论】:

      【解决方案5】:

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

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

      对我来说,确认!或跳过确认!在 after(:create) 块中导致电子邮件参数的验证错误并且不起作用。

      【讨论】:

      • 只是 u.skip_confirmation! 在构建之后为我工作。它还可以更快地创建用户。
      • 这是 2020 年唯一有效的方法(只需删除 confirm!
      【解决方案6】:

      将此行添加到您的 User 工厂定义中:

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

      【讨论】:

        【解决方案7】:

        您应该在create 之前调用skip_confirmation!,以便将其保留在用户身上。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-12-07
          • 2018-04-05
          • 1970-01-01
          • 1970-01-01
          • 2014-11-23
          • 2014-01-14
          • 1970-01-01
          相关资源
          最近更新 更多