2012-10-22 2 views
4

필요한 많은 관련 객체가있는 객체로 작업 할 때 Ruby gem 'FactoryGirl'을 효과적으로 사용하는 방법에 대한 조언을 찾고 있습니다.FactoryGirl을 사용하여 필요한 연관을 가진 객체 만들기

예를 들어, 내 수업간에 다음과 같은 관계가 있다고 가정 해보십시오.

class A < ActiveRecord 
    has_many B 
end 

class B < ActiveRecord 
    belongs_to A 
    has_many C 
end 

class C < ActiveRecord 
    belongs_to B 
end 

이제 C 컨트롤러의 테스트 사례를 작성하려면이 체인에 모든 개체를 만들어야합니다. 바로 지금, 그것은 내가 공장에서하는 일입니다. 그러나 더 좋은 방법이 있습니까?

+0

공장 내부의 코드를 개선하는 방법에 대해 질문하거나 테스트를 개선하는 방법을 묻고 있습니까? – gylaz

+0

둘 중 하나입니다. 아니면 둘다. 공장을 작성하는 더 나은 방법을 알고 있거나 테스트를 구조화하기위한 더 나은 접근법을 알고 있다면 분명히 그것에 대해 배우게 될 것입니다. – Eytan

답변

7

당신은 다음과 같이 설정하여 공장이있는 경우 : 당신의 인스턴스를 만들 때마다

FactoryGirl.define do 
    factory :library do 
    name "Chicago Public Library" 
    street_address "123 Morgan St." 
    end 

    factory :book do 
    title "A Great Book" 
    author "Mandy Yeats" 
    association :library 
    end 

    factory :page do 
    page_number 123 
    association :book 
    end 
end 

: 책 : 도서관 당신의 검사 결과 페이지가, FactoryGirl는 또한의 인스턴스를 생성됩니다. 도서관과 서적을 먼저 만들 필요는 없습니다. : book을 만들면 테스트 용 a : 라이브러리도 생성됩니다. 테스트에서 이러한 인스턴스를 다음과 같이 사용할 수 있습니다.

page.book.library.name  # after using FactoryGirl.create(:page) 
page.book.author 

book.library.street_address # after using FactoryGirl.create(:book) 

이것은 내가 발견 한 가장 간단한 방법입니다.

+0

나는 이것을 좋아한다. 나는 도서관이 책과 연결될 책이 페이지에 링크 될 협회를 위에서 아래로 만드는 정반대의 접근법을 시도했다. 따라서 FactoryGirl.create (: library)를 호출하면 책과 페이지가있는 라이브러리를 만들 수 있습니다. 하지만 책을 부르면 책 한 권만 남았을 것입니다. 당신이 사용하고있는 접근법이 훨씬 좋아 보인다. – Eytan

관련 문제