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

8

不论是否应该测试模型关联的存在性,我有一个名为Order的模型,并且我正在验证它在其has_many关联中至少有一个item,使用以下代码:

class Order < ActiveRecord::Base

  has_many :items

  validates :items, presence: true

end

我已经设置了FactoryGirl来检查我的工厂是否有效(检查有效性)。所以,除非我为其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` 错误,因为 order 工厂是无效的。
解决方法:
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

你正在执行create_list(:item)操作,你是否已经定义了item工厂? - vee
我认为你应该使用after(:create)而不是after(:build),因为仅仅使用build时,order并没有被保存,所以items中也没有order_id - vee
@vee 但如果它验证至少存在一个项目,那么它怎么可能在没有项目的情况下被创建? - Undistraction
1
@Pedr 在你的解决方法中,你是指 order.items << FactoryGirl.create(:item, order: order) 吗?还是你依赖于项目工厂来创建不同的订单?一个项目有一个或多个订单吗? - Dave Schweisguth
如果使用 build_list 而不是 create_list,它能正常工作吗? - Artin Boghosian
显示剩余4条评论
1个回答

1
根据定义,它将在构建之后调用.valid?。看起来它会在运行after(:build)块之前调用此函数。
尝试像这样编写你的工厂:
FactoryGirl.define do

  factory :order do

    ignore do
      items_count 1
    end

    items { build_list(:item, items_count) }

  end
end

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

如果可以的话,请让我知道这是否有效:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接