代码之家  ›  专栏  ›  技术社区  ›  muma

带有FactoryGirl序列的自定义范围

  •  7
  • muma  · 技术社区  · 12 年前

    在旧版本中,类似这样的事情是可能的( more examples ):

    Factory.sequence(:email, 50..60) do |n|
      "user_#{n}@example.com"
    end
    

    在新的FactoryGirl版本中使用它将创建一个 NoMethodError: undefined method 'next' for 0..10:Range .

    特别是我有一个模型 user 它有多个 time_entries 。我想创建默认值。为了简单起见,每个用户都应该创建 n 时间条目。条目的创建方式如下:

    FactoryGirl.define do
      factory :time_entry do
        start_time { generate(:time_entry_begin) }
        end_time { generate(:time_entry_end) }
      end
    end
    
    FactoryGirl.define do
      sequence(:time_entry_begin, 0..10) do |n|
        DateTime.now - n.hours
      end
    end
    
    FactoryGirl.define do 
      sequence(:time_entry_end, 0..10) do |n|
        DateTime.now - n.hours + (1 + n).minutes
      end
    end
    
    1 回复  |  直到 12 年前
        1
  •  16
  •   Stefan    12 年前

    您必须传递一个响应 next 例如,枚举器:

    FactoryGirl.define do
      factory :user do
        sequence(:email, (50..60).cycle) { |n| "user_#{n}@example.com" }
      end
    end
    
    FactoryGirl.build(:user) #=> <#User @email="user_50@example.com">
    FactoryGirl.build(:user) #=> <#User @email="user_51@example.com">
    FactoryGirl.build(:user) #=> <#User @email="user_52@example.com">
    # ...
    FactoryGirl.build(:user) #=> <#User @email="user_59@example.com">
    FactoryGirl.build(:user) #=> <#User @email="user_60@example.com">
    # `cycle` will start over:
    FactoryGirl.build(:user) #=> <#User @email="user_50@example.com">