FactoryGirl + Faker - DB 시드 데이터의 모든 객체에 대해 동일한 데이터가 생성됩니다.

StackOverflow https://stackoverflow.com//questions/25068869

문제

공장 및 Faker를 사용하여 내 seeds.rb 파일에서 사용자 오브젝트를 생성하지만 일부 이유로 정확히 동일한 사용자가 생성되고 전자 메일 고유성 유효성 검사로 인해 rake db:seed가 실패합니다.

사용자를위한 공장 :

#users.rb
require 'faker'

FactoryGirl.define do
  factory :user do
    first_name            Faker::Name.first_name
    last_name             Faker::Name.last_name
    phone                 Faker::PhoneNumber.cell_phone
    email                 Faker::Internet.email
    password              "password"
    password_confirmation "password"
  end
end
.

seeds.rb 파일의 코드 :

#seeds.rb
rand(5..11).times { FactoryGirl.create(:user) }
.

오류 :

ActiveRecord::RecordInvalid: Validation failed: Email has already been taken

콘솔을 열고 FactoryGirl.create(:user)를 사용하면 동일한 결과를 얻습니다 ... 동일한 개체가 Faker::Internet.email를 여러 번 실행하면 여러 번 전자 메일을 얻을 수 있습니다.

factorgirl :

[1] pry(main)> FactoryGirl.create(:user)
...
=> #<User id: 3, first_name: "Osvaldo", last_name: "Wunsch", email: "willy@damore.net", phone: "(912)530-4949 x64848", created_at: "2014-07-31 20:57:27", updated_at: "2014-07-31 20:57:27", encrypted_password: "$2a$10$mxWC7yLYR0m/Sw8MO6Lyru.xuTHCdCEuM9Orx3LXGApF...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil>
[2] pry(main)> FactoryGirl.create(:user)
...
ActiveRecord::RecordInvalid: Validation failed: Email has already been taken
.

faker 자체로 :

[3] pry(main)> Faker::Internet.email
=> "hobart_purdy@goodwinmills.org"
[4] pry(main)> Faker::Internet.email
=> "pierce_brekke@gislasonrolfson.net"
.

여기에 뭐 없습니다?FactoryGirl을 통해 사용할 때마다 Faker가 동일한 데이터를 생성하는 이유는 무엇입니까?

도움이 되었습니까?

해결책

생성 된 각 인스턴스에 대해 값을 다시 평가할 경우 블록을 전달해야합니다.

대신

email   Faker::Internet.email
.

시도 ...

email   { Faker::Internet.email }
.

다른 팁

Faker를 사용하여 고유성을 통과하는 속성을 얻는 것은 안티 패턴 일 수 있습니다.또한 테스트에서 Faker의 반 랜덤 출력을 갖는 것이 나쁜 생각 일 수도 있습니다. 때로는 테스트가 실패하면 기꺼이 기대하지 않은 가치를 기침했기 때문에 때로는 테스트가 실패하고 야생 거위 쫓기는 것입니다.

최근에 나는 FactoryGirl의 서열을 사용하여 예측 가능하지만 독창적 인 값을 얻고 있습니다.

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"
.

공장 소녀 팁에서 찍은 @ http://arjanvandergaag.nl/blog/factory_girl_tips.htmlp / pax/a>

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top