使用FactoryGirl验证has_many关联至少具有一个模型

时间:2014-06-20 14:07:19

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

不管你是否应该测试模型关联的存在性,我有一个名为Order的模型我正在验证它的item中至少有一个has_many关联使用:

class Order < ActiveRecord::Base

  has_many :items

  validates :items, presence: true

end

我已将FactoryGirl设置为lint我的工厂(检查有效性)。因此,除非我为其has_many集合创建项目,否则我的订单工厂无效。

我的orders工厂看起来像这样:

FactoryGirl.define do

  factory :order do

    ignore do
      items_count 1
    end

    after(:build) do |order, evaluator|
      create_list(:item, evaluator.items_count, order: order)
    end

  end
end

根据Factory Girl的使用入门

FactoryGirl.lint builds each factory and subsequently calls #valid? on it

然而,当我运行我的规格时,Factory Girl会抛出FactoryGirl::InvalidFactoryError,因为订单工厂无效。

解决方法

after(:build) do |order, evaluator|
   evaluator.items_count.times do
     order.items << FactoryGirl.create(:item)
   end
   #create_list(:item, evaluator.items_count, order: order)
 end

1 个答案:

答案 0 :(得分:0)

根据定义,它将在建造后调用.valid?。它似乎会在运行after(:build)块之前调用它。

尝试像这样写你的工厂:

FactoryGirl.define do

  factory :order do

    ignore do
      items_count 1
    end

    items { build_list(:item, items_count) }

  end
end

这应该在调用.valid?之前构建项目。

让我知道这是否有效:)