【发布时间】: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 << FactoryGirl.create(:item, order: order),还是您依赖项目工厂来创建不同的订单?一件商品有一个还是多个订单?
标签: ruby-on-rails ruby rspec factory-bot factory