49

공장 소녀를 사용하여 내 모델/그룹 단위 테스트에서 두 인스턴스를 만듭니다. 나는내 모델 유효성 검사를 건너 뛸 공장 - 소녀 만들기

describe ".current" do 
    let!(:current_group) { FactoryGirl.create(:group, :expiry => Time.now + 1.week) } 
    let!(:expired_group) { FactoryGirl.create(:group, :expiry => Time.now - 3.days) } 

    specify { Group.current.should == [current_group] } 
    end 

내 문제는 내가 모델에서 유효성 검사를 가지고 있다는 것입니다 ... 전화 아래에 따라 만료 속성에 따라 오직 '현재'그룹을 반환 .current 것을 확인하기 위해 모델을 테스트입니다 새 그룹의 만료를 확인하는 것은 오늘 날짜 이후입니다. 이렇게하면 아래의 유효성 검사 실패가 발생합니다.

1) Group.current 
    Failure/Error: let!(:expired_group) { FactoryGirl.create(:group, :expiry => Time.now - 3.days) } 
    ActiveRecord::RecordInvalid: 
     Validation failed: Expiry is before todays date 

강제로 그룹을 만들거나 공장 소녀를 사용하여 만들 때 검증 주위에 얻을 수있는 방법이 있나요?

답변

62

이 FactoryGirl에 매우 구체적인 아니지만, save(:validate => false)를 통해 모델을 저장할 때 항상 검증을 우회 할 수있다 :

describe ".current" do 
    let!(:current_group) { FactoryGirl.create(:group) } 
    let!(:old_group) { 
    g = FactoryGirl.build(:group, :expiry => Time.now - 3.days) 
    g.save(:validate => false) 
    g 
    } 

    specify { Group.current.should == [current_group] } 
end 
+0

정확히 그게 내가 감사, 무엇을 찾고 있었다! – Norto23

+0

더 나은 솔루션을 보려면 아래의 Jason Denney의 대답을 참조하십시오. –

5

를이 특정 날짜-baesd 검증 케이스의 경우, 일시적하는 timecop 보석을 사용할 수 있습니다 과거에 생성 된 오래된 레코드를 시뮬레이션하는 시간을 변경하십시오.

1

시나리오에 따라 업데이트시에만 유효성을 검사하도록 변경할 수 있습니다. 예 : :validates :expire_date, :presence => true, :on => [:update ]

46

이 솔루션은 https://github.com/thoughtbot/factory_girl/issues/578입니다. 공장 내부

:

to_create {|instance| instance.save(validate: false) } 
+4

이것은 받아 들인 것보다 훨씬 더 우아한 해결책입니다. –

+3

범용 공장에서이 작업을 수행하면 해당 팩토리에서 생성 할 때마다 유효성 검사를 건너 뜁니다. 서브 - 팩토리 (또는 특성)에서만이 기술을 사용하는 것이 가장 좋습니다. – tgf

+0

당신은 거의 이것을 특성에 넣고 싶을 것입니다. 아래 Tim Scott의 답변을 참조하십시오. –

3
foo = build(:foo).tap{ |u| u.save(validate: false) } 
6

그것은 공장에서 기본적으로 검증을 생략하는 나쁜 생각입니다. 일부 머리카락을 찾아 낼 것입니다.

가장 좋은 방법은, 내가 생각 :

다음
trait :skip_validate do 
    to_create {|instance| instance.save(validate: false)} 
end 

테스트에서 :

create(:group, :skip_validate, expiry: Time.now + 1.week) 
+0

이것이이 문제를 해결하는 가장 좋은 방법입니다! –

관련 문제