내 모델 유효성 검사를 우회하는 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
'Programing' 카테고리의 다른 글
TypeScript 내보내기 가져온 인터페이스 (0) | 2020.11.07 |
---|---|
JS에서 페이지 언로드 (탐색)를 어떻게 중지합니까? (0) | 2020.11.07 |
이진 문자열을 십진수로 변환하는 방법? (0) | 2020.11.07 |
MatchCollection을 string 형 배열로 변환 (0) | 2020.11.07 |
Elixir에서 현재 날짜 및 / 또는 시간 가져 오기 (0) | 2020.11.07 |