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

Und*_*ion 7 ruby factory rspec ruby-on-rails factory-bot

抛开关于你是否应该测试模型关联的存在的论据,我有一个模型被调用Order,我正在验证它item在其has_many关联中至少有一个使用:

class Order < ActiveRecord::Base

  has_many :items

  validates :items, presence: true

end
Run Code Online (Sandbox Code Playgroud)

我已将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
Run Code Online (Sandbox Code Playgroud)

根据Factory Girl的入门指南:

FactoryGirl.lint builds each factory and subsequently calls #valid? on it
Run Code Online (Sandbox Code Playgroud)

但是,当我运行我的规格时,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
Run Code Online (Sandbox Code Playgroud)

ame*_*dit 1

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

尝试像这样编写你的工厂:

FactoryGirl.define do

  factory :order do

    ignore do
      items_count 1
    end

    items { build_list(:item, items_count) }

  end
end
Run Code Online (Sandbox Code Playgroud)

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

让我知道这个是否奏效 :)