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

공장 소녀 도입 의 차이 묘사 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)

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



답변

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

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

예 :

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

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

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

최신 정보

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


답변

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

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


답변

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

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

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


답변