3

간체 예 : Animal 모델RSpec에/FactoryGirl는 - STI 레일 - 평등

내가 최근에 설치 Single Table Inheritance합니다. CatDogAnimal의 하위 클래스입니다. Animal의 유형이 시험 관련이 있기 때문에 내가 let(:animal) { Factory.create(:animal) } 전화를 거의 모든 지역 내 테스트 스위트 factory :animal do type { ["Dog","Cat"] }.sample end

:

가 나는 Animal 공장이있다. STI로 이동 한 이후에 수퍼 클래스 Animal이 팩토리에서 반환 되었기 때문에 이러한 동물에 대한 평등 검사를 수행하는 곳에서 오류가 발생하지만 연관 객체가 Animal을 인스턴스화하면 하위 클래스를 반환합니다.

예 : expected: #<Cat:0x007fa01a8cd360 same_other_attributes...> actual: #<Animal:0x007fa01b8d33b8 same_other_attributes...>

나는 그것의 서브 클래스의 인스턴스를 반환하는 Animal 공장을 변경할 수있는 방법이 있나요 : expect(zoo.animal).to eq(animal)는 실패?

팩토리가 생성 한 후에 Animal에서 .reload을 호출하려고했지만 새 (하위) 클래스를 다시로드하지 못했습니다. 정상적으로 변경을 강제로 superclass.becomes!(subclass) 호출 할 수 있지만 실제로 변환 된 개체를 반환하는 방식으로 FactoryGirl 콜백에 넣을 방법을 모른다.

+0

은 무엇 당신의'animal' 선언은'Zoo'처럼 보이나요? 부모 클래스 대신 자식 클래스를 반환하도록이 선언을 변경할 수 있습니다. – kcdragon

+0

테스트 스위트를 {[ "Dog", "Cat"]} .sample.class로 변경할 수 있습니까? – hashrocket

+0

@HashRocket 어떻게 도움이 될까요? @kcdragon 그 구체적인 예에서'Zoo' has_one'Animal'과 나는 그 동물원의 동물을 올바르게 설정하는 작업을 테스트합니다. 하지만, 필자가 언급 한 바와 같이 테스트 스위트 전체에서 실패한 테스트를 얻는 것은 중요하지 않습니다. 'Factory'를 사용하여 만든 Animal이 이제는 Cat이나' 개'. 내가 왜 * 왜 *, 어디서나 타입을 지정하는 것보다 원래 만든 '동물'과 일치하는지 확인하기 위해 할 수있는 일이 있는지 궁금합니다. (특히 중요하지 않을 때). – kittyminky

답변

6

당신은 initialize_with

예를 사용하여 서브 클래스의 인스턴스를 반환하는 슈퍼 클래스 공장을 강제 할 수

initialize_with do 
    klass = type.constantize 
    klass.new(attributes) 
end