간체 예 : Animal
모델RSpec에/FactoryGirl는 - STI 레일 - 평등
내가 최근에 설치 Single Table Inheritance
합니다. Cat
및 Dog
은 Animal
의 하위 클래스입니다. 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
콜백에 넣을 방법을 모른다.
은 무엇 당신의'animal' 선언은'Zoo'처럼 보이나요? 부모 클래스 대신 자식 클래스를 반환하도록이 선언을 변경할 수 있습니다. – kcdragon
테스트 스위트를 {[ "Dog", "Cat"]} .sample.class로 변경할 수 있습니까? – hashrocket
@HashRocket 어떻게 도움이 될까요? @kcdragon 그 구체적인 예에서'Zoo' has_one'Animal'과 나는 그 동물원의 동물을 올바르게 설정하는 작업을 테스트합니다. 하지만, 필자가 언급 한 바와 같이 테스트 스위트 전체에서 실패한 테스트를 얻는 것은 중요하지 않습니다. 'Factory'를 사용하여 만든 Animal이 이제는 Cat이나' 개'. 내가 왜 * 왜 *, 어디서나 타입을 지정하는 것보다 원래 만든 '동물'과 일치하는지 확인하기 위해 할 수있는 일이 있는지 궁금합니다. (특히 중요하지 않을 때). – kittyminky