【问题标题】:Validating That A has_many Association Has At Least One Model When Using FactoryGirl在使用 FactoryGirl 时验证 has_many 关联至少有一个模型
【发布时间】:2014-06-20 14:07:18
【问题描述】:

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

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

根据工厂女孩的入门

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

【问题讨论】:

  • 你在做一个create_list(:item),你有item工厂定义吗?
  • 是的。项目工厂在那里并且有效。
  • 我认为您应该为此使用after(:create) 而不是after(:build),因为仅构建order 不会保存并且items 没有order_id
  • @vee 但是如果它验证了至少一个项目的存在,那么没有一个项目如何创建?
  • @Pedr 在您的解决方法中,您的意思是order.items &lt;&lt; FactoryGirl.create(:item, order: order),还是您依赖项目工厂来创建不同的订单?一件商品有一个还是多个订单?

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


【解决方案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? 之前构建项目。

让我知道这是否有效:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多