ChrisBarthol
ChrisBarthol

Reputation: 4959

How to get a random number in FactoryGirl?

Is it possible for FactoryGirl to define a random number say from 0-10?

    factory :rating do
       ranking 1 #random number?
       recipe
    end

I'd really like the ranking number generated to be a random value between 0-10.

I want to generate ratings with different numbers, but don't want to explicitly define them in rspec. This would be used to display the average and other stats from the rating numbers. Ex: How many 10's, How many 0's, average etc.

Upvotes: 18

Views: 14610

Answers (2)

Jon Kern
Jon Kern

Reputation: 3235

As of version 4.4, the following works for me...

factory :rating do
   ranking {rand(1..10)}
   recipe
end

And for a slightly different use of randomization:

FactoryGirl.define do
  factory :plan do
    name {["Free", "Standard", "Enterprise"].sample}
    price {Faker::numerify('$##')}
  end
end

Creating a few instances, you can see the randomization of name, and the randomization of the price:

2.0.0-p247 :010 > 4.times.each {FactoryGirl.create(:plan)}
2.0.0-p247 :011 > ap Plan.to_list
[
    [0] [
        [0] "Free: $48",
        [1] BSON::ObjectId('549f6da466e76c8f5300000e')
    ],
    [1] [
        [0] "Standard: $69",
        [1] BSON::ObjectId('549f6da466e76c8f5300000f')
    ],
    [2] [
        [0] "Enterprise: $52",
        [1] BSON::ObjectId('549f6da466e76c8f53000010')
    ],
    [3] [
        [0] "Free: $84",
        [1] BSON::ObjectId('549f6da466e76c8f53000011')
    ]
]

Upvotes: 23

Scott Solmer
Scott Solmer

Reputation: 3897

Something like this possibly?

FactoryGirl.define do
  sequence(:random_ranking) do |n|
    @random_rankings ||= (1..10).to_a.shuffle
    @random_rankings[n]
  end

  factory :user do
    id { FactoryGirl.generate(:random_ranking) }
  end
end

Reference here

Upvotes: 6

Related Questions