공장 소녀 도입 의 차이 묘사 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
더 나은 성능 을 위해 사용 하는 것이 가장 좋습니다 . 여기에서 자세한 내용을 읽어보십시오 .