【问题标题】:Define multiple custom records using FactoryGirl使用 FactoryGirl 定义多个自定义记录
【发布时间】:2017-05-09 12:26:51
【问题描述】:

我有一个希望使用 FactoryGirl 创建的键和值的散列。我经历了具有类似要求的POST,但无法理解实现我想要的方法。以下是我尝试过的:

statuses = {
  "holding_status" => "Holding",
  "scheduled_status" => "Scheduled",
  "submitted_status" => "Submitted",
  "cancelled_status" => "Cancelled",
  "failed_status" => "Failed",
  "none_status" => nil
}

statuses.each do |code, name|
  FactoryGirl.define do
    factory :submit_statuses do
      code code
      name name
    end
  end
end

但是,它给了我以下错误(预期):

/var/lib/gems/2.2.0/gems/factory_girl-4.5.0/lib/factory_girl/decorator.rb:10:in `method_missing':工厂已经注册: submit_statuses (FactoryGirl::DuplicateDefinitionError)

编辑(再试一次)

FactoryGirl.define do
  statuses.each do |code, name|
    factory "submit_#{code}" do
      code code
      name name
    end
  end
end

create(:submit_holding_status)
create(:submit_scheduled_status)
create(:submit_submitted_status)
create(:submit_cancelled_status)
create(:submit_failed_status)
create(:submit_none_status)

【问题讨论】:

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


    【解决方案1】:

    您希望如何调用这家工厂?我有点不清楚你希望在这里实现什么。

    我推荐的一种可能方法是将每个状态类型定义为factory trait

    statuses = {
      "holding_status" => "Holding",
      "scheduled_status" => "Scheduled",
      "submitted_status" => "Submitted",
      "cancelled_status" => "Cancelled",
      "failed_status" => "Failed",
      "none_status" => nil
    }
    
    FactoryGirl.define do
      factory :submit_status do
        statuses.each do |code, name|
          trait code.to_sym do
            code code
            name name
          end
        end
      end
    end
    
    # Usage:
    FactoryGirl.create(:submit_status, :holding_status)
    
    # Or:
    statuses.map { |status| FactoryGirl.create(:submit_status, status) }
    

    【讨论】:

    • 是的,实际上对 OP 的解释更好。
    • 只是为了理解,请您看看我的 EDIT 并告诉我trait 与我的代码相比有什么优势
    • 您的新代码有效,但我认为它的质量很差。您正在污染工厂的全局命名空间,这似乎还不错,因为每个状态代码都被称为 <something>_status ... 但是为什么 IS 一切都这样命名?您的状态应该只是holdingscheduledsubmitted 等。通过使用特征,您可以在逻辑上将每个工厂分组到一个“标题”下。
    • 我还建议将状态列表定义为常量(可能是SubmitStatus::Types?),而不是在多个位置重新定义此变量。但这是一个单独的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多