Ruby on rails 3 工厂女孩序列不递增
我试图让FactoryGirl为我生成一些名称,但序列似乎没有递增Ruby on rails 3 工厂女孩序列不递增,ruby-on-rails-3,rspec2,factory-bot,Ruby On Rails 3,Rspec2,Factory Bot,我试图让FactoryGirl为我生成一些名称,但序列似乎没有递增 # spec/factories/vessel.rb require 'factory_girl' FactoryGirl.define do sequence :vessel_name do |n| "TK42#{n}" end factory :vessel do name FactoryGirl.generate(:vessel_name) vessel_type 'fermente
# spec/factories/vessel.rb
require 'factory_girl'
FactoryGirl.define do
sequence :vessel_name do |n|
"TK42#{n}"
end
factory :vessel do
name FactoryGirl.generate(:vessel_name)
vessel_type 'fermenter'
volume_scalar 100.0
volume_units 'bbl'
end
end
规格输出为
Vessel
working in the factory
makes a valid vessel
makes another valid vessel (FAILED - 1)
Failures:
1) Vessel working in the factory makes another valid vessel
Failure/Error: vessel = FactoryGirl.create(:vessel)
ActiveRecord::RecordInvalid:
Validation failed: Name has already been taken
# ./spec/models/vessel_spec.rb:13:in `block (3 levels) in <top (required)>'
为什么FactoryGirl不在我的规范中生成一系列名称?答案是:
require 'factory_girl'
FactoryGirl.define do
sequence :vessel_name do |n|
"TK42#{n}"
end
factory :vessel do
vessel_type 'fermenter'
volume_scalar 100.0
volume_units 'bbl'
after :build do |v|
v.name = FactoryGirl.generate(:vessel_name)
end
end
end
这是可行的,但它意味着您不能覆盖规范中任何地方的名称,因为构建后挂钩将始终运行并覆盖任何名称 原始示例不起作用的原因是,您在定义工厂时调用序列,而不是在工厂运行时调用序列。您可以提供块到属性定义,该定义将在每次工厂运行时调用。这样,您就有机会为每个实例生成一个值,而不是为所有实例生成一个值。这最常用于序列和时间 您可以使用以下代码段修复原始示例:
sequence :vessel_name do |n|
"TK42#{n}"
end
factory :vessel do
name { generate(:vessel_name) }
vessel_type 'fermenter'
volume_scalar 100.0
volume_units 'bbl'
end
如果可以使用相同的格式生成所有名称,也可以通过重命名序列来完全忽略该值:
sequence :name do |n|
"TK42#{n}"
end
factory :vessel do
name
vessel_type 'fermenter'
volume_scalar 100.0
volume_units 'bbl'
end
但是,如果您需要不同工厂的不同名称格式,那么这将不起作用
require 'factory_girl'
FactoryGirl.define do
sequence :vessel_name do |n|
"TK42#{n}"
end
factory :vessel do
vessel_type 'fermenter'
volume_scalar 100.0
volume_units 'bbl'
after :build do |v|
v.name = FactoryGirl.generate(:vessel_name)
end
end
end
sequence :vessel_name do |n|
"TK42#{n}"
end
factory :vessel do
name { generate(:vessel_name) }
vessel_type 'fermenter'
volume_scalar 100.0
volume_units 'bbl'
end
sequence :name do |n|
"TK42#{n}"
end
factory :vessel do
name
vessel_type 'fermenter'
volume_scalar 100.0
volume_units 'bbl'
end