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)
根据定义,它将.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?这应该在调用之前构建该项目。
让我知道这个是否奏效 :)