【问题标题】:How to create multiple records in FactoryBot by iteration如何通过迭代在 FactoryBot 中创建多条记录
【发布时间】:2021-10-19 17:08:34
【问题描述】:

spec/factories/organisation_groups.rb

FactoryBot.define do
  @organisation_groups = [{name: 'WWZY', uuid: '68a0c637'}, {name: 'WCC', uuid: '0a13362e'}, {name: 'ECW', uuid: 'fdcdb1b2'}, {name: 'ZPE', uuid: 'fdcdb1b8'}]
  @organisation_groups.each do |group|
    factory :organisation_group do
      name group[:name]
      uuid group[:uuid]
    end
  end
end

我尝试使用 FactoryBot 创建多个记录,但问题是我收到此错误:

NoMethodError:
  undefined method 'name' in 'organisation_group' factory
  Did you mean? 'name { "WWZY" }'

user_spec.rb

describe '#organisation_group' do
    before(:each) do
      @organisation_groups = create(:organisation_group)
    end
end

更新 1

FactoryBot::DuplicateDefinitionError:
  Factory already registered: organisation_group

【问题讨论】:

  • 在循环内部的工厂内部,应该是name { group[:name] }
  • @LesNightingill 如果我按照您的建议进行操作,那么我会收到问题更新 1 中所述的错误。
  • 哦,是的,当然,我错过了那个错误,请参阅下面的答案

标签: ruby-on-rails ruby testing rspec


【解决方案1】:

事实证明这比我想象的要难!经过几次失误后,这行得通:

FactoryBot.define do
  factory :organisation do
    name { 'foo' }
    uuid { '12ab56ef' }
  end
end

调用

@organisation_groups = [
  {name: 'WWZY', uuid: '68a0c637'}, 
  {name: 'WCC', uuid: '0a13362e'}, 
  {name: 'ECW', uuid: 'fdcdb1b2'}, 
  {name: 'ZPE', uuid: 'fdcdb1b8'}
]

@organisation_list = @organisation_groups.map do |o| 
  FactoryBot.create(:organisation, name: o[:name], uuid: o[:uuid])
end

它不像您想要的那样干净,但它可以完成工作!

【讨论】:

  • 我收到此错误 NoMethodError: undefined method `each' for nil:NilClass
  • @user12763413 尝试将@organisation_groups 定义放在factory :organization_list do 之后的下一行
  • 它现在运行,但它只创建一条记录而不是整个列表 pry(# @ organization_groups => #
  • @user12763413 看起来很简单的问题!!我终于找到工作了,看看我的新编辑。
  • 在您的.map 调用中,FactoryBot.create(:organisation, o) 可能也可以工作,这是一种更简单的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多