FactoryGirl + Faker - same data being generated for every object in db seed data

99封情书 提交于 2019-12-02 21:43:52

You need to pass a block if you want the values re-evaluated for each instance created.

Instead of

email   Faker::Internet.email

try...

email   { Faker::Internet.email }

Using Faker to get uniqueness-passing attributes may be an anti-pattern. It may also be a bad idea to have Faker's semi-random output in tests - what if sometimes tests just fail and you are off to a wild goose chase just because Faker coughed up a value you did not expect?

Lately I have been using FactoryGirl's sequences to get predictable, yet uniqueness-passing values.

FactoryGirl.define do
  factory :user do
    sequence(:first_name, 1) { |n| "John#{n}" }
    sequence(:last_name, 1) { |n| "Doe#{n}" }
    sequence(:phone, 1) { |n| (111111111+n).to_s }               
    sequence(:email, 1) { |n| "email#{n}@example.com" }        
    password              "password"
    password_confirmation "password"
  end
end

FactoryGirl.create(:user).email #=> "email1@example.com"
FactoryGirl.create(:user).email #=> "email2@example.com"

Taken from Factory Girl tips @ http://arjanvandergaag.nl/blog/factory_girl_tips.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!