Programing

내 모델 유효성 검사를 우회하는 Factory-girl create

lottogame 2020. 11. 7. 08:55
반응형

내 모델 유효성 검사를 우회하는 Factory-girl create


Factory Girl을 사용하여 그룹의 모델 / 단위 테스트에서 두 개의 인스턴스를 만들고 있습니다. .current에 대한 호출이 아래에 따라 만료 속성에 따라 '현재'그룹 만 반환하는지 확인하기 위해 모델을 테스트하고 있습니다.

  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

내 문제는 새 그룹의 만료가 오늘 날짜 이후인지 확인하는 모델에 유효성 검사가 있다는 것입니다. 이로 인해 아래의 유효성 검사 실패가 발생합니다.

  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

Factory Girl을 사용하여 생성 할 때 강제로 그룹을 생성하거나 유효성 검사를 우회하는 방법이 있습니까?


이것은 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

https://github.com/thoughtbot/factory_girl/issues/578 에서이 솔루션을 선호합니다 .

공장 내부 :

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

편집하다:

참조 된 스레드와 다른 사람의 의견 / 솔루션에서 언급했듯이 테스트의 다른 곳에서 혼동 / 문제를 방지하기 위해 이것을 트레이 트 블록으로 래핑 할 수 있습니다. 예를 들어 유효성 검사를 테스트 할 때입니다.


공장에서 기본적으로 유효성 검사를 건너 뛰는 것은 나쁜 생각입니다. 그것을 발견하면 머리카락이 뽑힐 것입니다.

가장 좋은 방법은 다음과 같습니다.

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

그런 다음 테스트에서 :

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

이 특정 날짜 기반 유효성 검사 사례의 경우 timecop gem을 사용하여 일시적으로 시간을 변경하여 과거에 생성 된 이전 레코드를 시뮬레이션 할 수도 있습니다 .


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

공장에서 기본적으로 유효한 개체를 만들어야합니다. 임시 속성 을 사용하여 다음과 같은 조건부 논리를 추가 할 수 있음을 발견했습니다 .

transient do
  skip_validations false
end

before :create do |instance, evaluator|
  instance.save(validate: false) if evaluator.skip_validations
end

테스트에서 :

create(:group, skip_validations: true)

해당 모델의 모든 유효성 검사를 건너 뛰는 것은 좋지 않습니다.

spec/factories/traits.rb파일을 만듭니다 .

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

사양 수정

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

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

Depending on your scenario you could change validation to happen only on update. Example: :validates :expire_date, :presence => true, :on => [:update ]

참고URL : https://stackoverflow.com/questions/9322353/factory-girl-create-that-bypasses-my-model-validation

반응형