创建使用当前种子记录的FactoryGirl定义

时间:2014-07-22 23:42:39

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

我在FactoryGirl的GitHub页面(#623)中遇到了与通过种子数据触发唯一性验证相同的问题。

我的工厂最初看起来像这样:

factory :country, class: MyApp::Models::Country do
  code { MyApp::Models::Country.first.code }
  name { MyApp::Models::Country.first.name }
end

不理想并打破了短信,所以我使用#623中的建议进行了重构:

factory :country, class: MyApp::Models::Country do
  intitalize_with { MyApp::Models::Country.find_or_create_by(code: 'GB') }
end

但是我现在在linting上得到以下错误堆栈:

/Users/philostler/.rvm/gems/ruby-2.1.2/gems/activemodel-4.1.4/lib/active_model/attribute_methods.rb:435:in `method_missing': undefined method `intitalize_with=' for #<MyApp::Models::Country id: nil, code: nil, name: nil> (NoMethodError)
    from /Users/philostler/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.4/lib/active_record/attribute_methods.rb:208:in `method_missing'
    from /Users/philostler/.rvm/gems/ruby-2.1.2/gems/factory_girl-4.4.0/lib/factory_girl/attribute_assigner.rb:16:in `block (2 levels) in object'
    from /Users/philostler/.rvm/gems/ruby-2.1.2/gems/factory_girl-4.4.0/lib/factory_girl/attribute_assigner.rb:15:in `each'
    from /Users/philostler/.rvm/gems/ruby-2.1.2/gems/factory_girl-4.4.0/lib/factory_girl/attribute_assigner.rb:15:in `block in object'
    from /Users/philostler/.rvm/gems/ruby-2.1.2/gems/factory_girl-4.4.0/lib/factory_girl/attribute_assigner.rb:14:in `tap'
    from /Users/philostler/.rvm/gems/ruby-2.1.2/gems/factory_girl-4.4.0/lib/factory_girl/attribute_assigner.rb:14:in `object'

现在它试图在一个空白的模型对象上调用intitalize_with =,这当然会落空。

我只是希望工厂在仍然通过棉绒时使用已存在的记录。

我是以错误的方式解决这个问题还是存在错误(可能是因为我使用了命名空间)?

1 个答案:

答案 0 :(得分:0)

在使用FactoryGirl并使用常量声明class时,我经常遇到与非相关消息的奇怪错误,正如您所做的那样。使用字符串修复了我身边的情况,这肯定是自动加载相关的。

我不知道这是否是您的解决方案,但您可以尝试(为您的所有工厂做到这一点)

# Instead of
factory :country, class: MyApp::Models::Country do
  code { MyApp::Models::Country.first.code }
  ...
end

# Do
factory :country, class: 'MyApp::Models::Country' do
  code { MyApp::Models::Country.first.code }
  ...
end