Faker는 factory_girl에서 사용될 때 중복 데이터를 생성합니다.


86

Faker gem을 사용하여 일부 가짜 데이터를 팩토리에 채우려 고합니다.

Factory.define :user do |user|
  user.first_name Faker::Name::first_name
  user.last_name Faker::Name::last_name
  user.sequence(:email) {|n| "user#{n}@blow.com" }
end

그러나 이것이 first_name과 last_names가 다른 사용자를 생성 할 것으로 예상하지만 각각은 동일합니다.

>> Factory(:user)
=> #<User id: 16, email: "user7@blow.com", created_at: "2011-03-18 18:29:33",     
updated_at: "2011-03-18 18:29:33", first_name: "Bailey", last_name: "Durgan">
>> Factory(:user)
=> #<User id: 17, email: "user8@blow.com", created_at: "2011-03-18 18:29:39", 
updated_at: "2011-03-18 18:29:39", first_name: "Bailey", last_name: "Durgan">

Faker gem을 사용하여 원래 이름 만 재사용하지 않고 각 사용자의 새 이름을 생성하려면 어떻게해야합니까?


1
어둠 속에서 한 번 찍었지만, 다음과 같은 것을 사용해 보셨습니까 user.sequence(:first_name} {|n| Faker::Name::first_name}? FactoryGirl은 "픽스처"를로드 할 때 Faker 호출을 평가할 것입니다. sequence param,&block방법을 사용하면 이를 방지 할 수 있습니다.
Steven

답변:


156
Factory.define :user do |user|
  user.first_name { Faker::Name::first_name }
  user.last_name { Faker::Name::last_name }
  user.sequence(:email) {|n| "user#{n}@blow.com" }
end

가짜 주위에 괄호를 두십시오. 이 링크 참조


8
저는 stackoverflow를 너무 좋아합니다. 감사합니다. 윌, 제 베이컨을 구했습니다
Peter Nixey 2011 년

감사합니다. 이로 인해 문제가 해결되었습니다!
Oranges13 2013.03.07

5
왜 왜 왜? 여기서 무슨 일이 일어나고 있습니까?
jordanpg


10
슬프게도 이것이 항상 작동하는 것은 아닙니다. 이것은 기본적으로 새로운 임의의 가짜 객체를 얻지 만 RNG 때문에 여전히 실패 할 가능성이 있습니다.
Michael Lynch

46

Faker는 사용 가능한 가짜 데이터의 양이 제한되어 있기 때문에 여전히 중복 데이터를 제공 할 수 있습니다.

간단한 테스트 목적과 고유성 검증을 위해 다음을 사용했습니다.

sequence(:first_name) {|n| Faker::Name::first_name + " (#{n})"}
sequence(:last_name) {|n| Faker::Name::last_name + " (#{n})"}

3
이 답변은 더 많은 찬성 투표가 필요합니다. 테스트에서 많은 인스턴스를 생성 할 때 발생할 수 있습니다.
Enrico Carlesso

네, 엔리코에 동의합니다. +1
karlingen 2015 년

좋은 생각이지만, 이름과 성을 사용하여 이메일을 생성하거나 형식에 대한 유효성 검사가있는 경우 괄호를 추가하면 나머지가 깨질 수 있습니다 (괄호 : P가있는 이름을 모름).
Cyril Duchon-Doris

18

정답을 유지하기 위해 여기 블로그에서 옮겨 왔으며 답변에 대한 신용을 인정하지 않습니다.

아래 코드를 사용하면 faker가 고유 한 이름을 생성하지 않습니다.

Factory.define :user do |u|
  u.first_name Faker::Name.first_name
  u.last_name Faker::Name.last_name
end

그러나 faker 주위에 중괄호를두면 작동합니다!

Factory.define :user do |u|
  u.first_name { Faker::Name.first_name }
  u.last_name { Faker::Name.last_name }
end

이유를 설명하기 위해 첫 번째 예는 동일한 이름을 생성하는 것입니다. 한 번만 평가합니다. 두 번째 예는 공장이 사용될 때마다 평가합니다.

이는 {}게으른 평가를 제공 하기 때문 입니다. 본질적으로 그들은 Faker 호출과 함께 proc / lambda를 반환 값으로 제공합니다.


게시 해주셔서 감사합니다. 왜 Faker가 임의의 데이터를 생성 할 수 없었는지 알 수 없었고, 제가 만난 모든 예가 나에게 이상해 보이는 시퀀싱을 사용하는 방법을 보여준 것처럼 보였습니다. 나는 Faker를 사용하여 각 레코드가 순서가 아닌 무작위로 기록되도록하고 싶었습니다. Faker 호출 주위에 중괄호를 추가하는 것만으로 문제가 해결되었습니다. 간단하고 우아합니다!
Blimey85

5

속성에 대한 고유성 유효성 검사가있을 때 시퀀스를 사용하는 것의 (비효율적) 대안은 제안 된 값이 이미 존재하는지 확인하고 고유 할 때까지 새 값을 계속 시도하는 것입니다.

FactoryGirl.define do
  factory :company do
    name do
      loop do
        possible_name = Faker::Company.name
        break possible_name unless Company.exists?(name: possible_name)
      end
    end
  end
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.