2013-08-21 2 views
0

FactoryGirl을 사용하여 테스트를 작성하려고하며 입력 매개 변수를 기반으로 생성 된 클래스에 대한 팩터 리를 생성하려고합니다. MyTable.create_subclass이 인수를 사용하여 구축 MyTable의 서브 클래스를 반환초기 정의 후 FactoryGirl 팩터 리 추가

setup do 
    FactoryGirl.define do 
    factory :my_table_1, :class => MyTable.create_subclass(1) do 
     my_table_traits 
    end 
    end 
end 

(당신이 생각 하듯이, MyTable는, ActiveRecord 클래스) : 그래서 내 setup 블록에서 나는 이런 식으로 뭔가를 시도했다.

하지만 작동하지 않습니다. 내가 FactoryGirl.find_definitions에 대한 호출을 추가했지만 중복 정의 오류가 발생했습니다. 또한 definemodify으로 변경하려고 시도했지만 공장을 추가 할 수없는 것 같습니다. 기존 팩을 수정하는 것만 가능합니다.

테스트를 실행할 때 어떻게 팩터 리를 추가 할 수 있습니까? 아니면 테스트가 실행될 때까지 존재하지도 않는 동적으로 생성 된 클래스에 대해이 팩토리를 설정하는 다른 방법이 있습니까?

상황 :

MyTable 최종 테이블로 데이터를로드되는 것입니다. 처리하는 동안, 실제 테이블에로드되기 전에 데이터를로드하기 위해 임시 테이블을 작성하여 준비합니다. 이러한 임시 테이블은 인수에 따라 동적으로 생성되는 서브 클래스 MyTable으로 표시됩니다. 이 테스트의 목적은 서브 클래스/임시 테이블에서 스테이지를 완료 한 후에 데이터를 MyTable에 올바르게 삽입했는지 확인하는 것입니다.

FactoryGirl을 사용하여 다른 것들에 대한 테스트 데이터를 작성 했으므로이 테스트에서 임시 테이블에 대한 테스트 데이터를 작성하는 데 자연스러운 확장이 필요합니다.

+0

테스트 중에 새 팩토리 정의를 작성하려는 이유가 무엇입니까? 그것은 다소 공장의 목적에 어긋납니다. 정말로 이것을하고 싶다면 다른 클래스의 인스턴스를 만들거나 빌드 할 수있는 도우미 메서드를 사용하는 것이 좋습니다 ... – jurglic

+0

왜 내가이 작업을 수행하려고하는지 설명하기 위해이 컨텍스트에 대해 뭔가를 추가했습니다. 나는 그것이 공장을위한 일반적인 유스 케이스가 아니라는 것을 깨닫는다. –

답변

0

동료가이 작업을 수행하는 방법을 보여주었습니다. 'initialize_with'를 재정의하고 특별한 'attributes'변수를 사용하여 작업을 완료해야합니다.

factory :my_table_temp_loading_table, :class => ActiveRecord::Base do 
    initialize_with do 
    MyTable.create_subclass(attributes[:subclass_id]).new(attributes) 
    end 
    my_table_traits 
end 
관련 문제