FactoryGirl에서 빌드 및 생성 방법의 차이점은 무엇입니까?


95

공장 소녀 도입 의 차이 묘사 FactoryGirl.build()FactoryGirl.create():

# Returns a User instance that's not saved
user = FactoryGirl.build(:user)

# Returns a saved User instance
user = FactoryGirl.create(:user)

나는 여전히 둘의 실질적인 차이점을 이해하지 못합니다. 다른 사람이 아닌 하나를 사용하고 싶은 예를 누군가가 줄 수 있습니까? 감사!

답변:


117

create()그동안 방법은 모델의 인스턴스를 지속 build()하는 방법은 메모리에 유지합니다.

개인적 create()으로 DB에 쓰는 것은 테스트 시간이 많이 걸리므로 지속성이 정말로 필요할 때만 방법을 사용합니다 .

예 :

create()내 인증 엔진이 DB를 쿼리하기 때문에 인증 할 사용자를 생성합니다 .

모델에 속성이 있는지 확인하려면 build()DB 액세스가 필요하지 않기 때문에 메서드가 수행합니다.

it{Factory.build(:user).should respond_to(:name)}

최신 정보

"연관을 구축 할 때 실제로 '만들기'하는 한 가지 예외가 있습니다. 즉, 연상이 더 이상 기억에 없지만 지속됩니다.이 점을 명심하십시오."– Shakes


16
연결을 구축 할 때 실제로 '생성'하는 한 가지 예외가 있습니다. 즉, 연결은 더 이상 메모리에 없지만 지속됩니다. 명심하십시오
Shakes

@Shakes, 나는 더 이상 레일에서 일하지 않습니다. 가능한 한 빨리 확인하겠습니다.
Helio Santos

사람의 각 인스턴스 대체 할 수있는 도구를 만들었습니다 create와를 build하고, 테스트가 실패 할 경우 실행 취소?
mgold

#create디스크에서 지속 된 개체를 읽고 반환 합니까 , 아니면 유지 한 후 메모리에있는 개체를 반환합니까? 즉, is doing is create(...)equivalent to create(...).reload?
Dennis

@mgold Vim은 그런 일을 꽤 잘합니다.
제한된 속죄

15

를 사용 FactoryGirl.build(:factory_name)하면 db에 유지되지 않고을 호출하지 않으므로 save!Active Record 유효성 검사가 실행되지 않습니다. 훨씬 빠르지 만 유효성 검사가 중요 할 수 있습니다.

를 사용 FactoryGirl.create(:factory_name)하면 db에 유지되고 Active Record 유효성 검사가 호출됩니다. 이것은 분명히 느리지 만 유효성 검사 오류를 포착 할 수 있습니다 (테스트에서 문제가있는 경우).


11
또는 FactoryGirl.build (: factory_name) .valid를 수행 할 수 있습니까? 데이터베이스에 저장하지 않고 유효성 검사를 실행합니다.
jinavar1 2014 년

1

FactoryGirl.create()새 개체 및 연결 (팩토리에있는 경우)을 만듭니다. 그들은 모두 데이터베이스에 유지됩니다. 또한 모델 및 데이터베이스 유효성 검사를 모두 트리거합니다. 콜백 after(:build)after(:create)공장 저장 후 호출됩니다. 또한 before(:create)공장이 저장되기 전에 호출됩니다.

FactoryGirl.build()객체를 저장하지 않지만 팩토리에 연관이있는 경우 데이터베이스에 계속 요청합니다. 연결된 개체에 대해서만 유효성 검사를 트리거합니다. after(:build)공장이 건설 된 후 콜백 이 호출됩니다.

대부분의 경우 테스트 모델은 build_stubbed더 나은 성능 을 위해 사용 하는 것이 가장 좋습니다 . 여기에서 자세한 내용을 읽어보십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.