Rails factory_girls和验证问题

时间:2016-12-30 13:40:03

标签: ruby-on-rails factory-bot

我有HABTM协会

我的模特

 class Ssr < ActiveRecord::Base
    has_and_belongs_to_many :ssr_groups
    validates :ssr_groups, presence: true
 end

class SsrGroup < ActiveRecord::Base
  has_and_belongs_to_many :ssrs, dependent: :destroy
  validates :name, presence: true
end

我的工厂

  FactoryGirl.define do
  factory :ssr do
    type 'type' 
    ssr_groups
   end
 end

FactoryGirl.define do
  factory :ssr_group, class: 'SsrGroup', aliases: [:ssr_groups] do
    name { SecureRandom.hex }
  end
end

我的问题是我想要创建FactoryGirl.create(:ssr)

我有NoMethodError: undefined method each for #<SsrGroup:0x007fbfdf792100>

为什么会这样?

1 个答案:

答案 0 :(得分:1)

问题在于,您的ssr工厂预计会收集ssr_group,而您正在做的只是一个。这就是错误的原因,因为它试图在创建的ssr_group上做foreach。

要解决此问题,您可以执行以下操作:

FactoryGirl.define do
  factory :ssr do
    type 'type' 
    after(:create) do |ssr, evaluator|
      create_list(:ssr_group, 1, ssrs: [ssr])
    end
  end
end

如果愿意,您可以使用build策略代替create

修改

你可以改善你的工厂,如下:

FactoryGirl.define do
  factory :ssr do
    type 'type' 

    factory :ssr_with_groups do
      transient do
        groups_count 5 # Default count of ssr_groups it will create
      end

      after(:create) do |ssr, evaluator|
        create_list(:ssr_group, evaluator.groups_count, ssrs: [ssr])
      end
    end
  end
end

这样,它更灵活,您可以像这样使用它:

create(:ssr_with_groups, groups_count: 10)

它会创建一个带有10个ssr_groups的ssr。

编辑2:

鉴于你在关联上有一个状态验证,你需要在保存对象之前添加关联,所以使用构建策略,如下所示:

FactoryGirl.define do
  factory :ssr do
    type 'type' 
    after(:build) do |ssr, evaluator|
      ssr.ssr_groups << build_list(:ssr_group, 1, ssrs: [ssr])
    end
  end
end

您可以深入了解文档:http://www.rubydoc.info/gems/factory_girl/file/GETTING_STARTED.md#Associations