Ruby on rails 3 工厂女孩序列不递增

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

我试图让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 '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