2013-07-02 2 views
0

나는 공장과 형질이있다. 나는 특성을 사용하여이 속성을 공장에서 속성을 설정하고 나중에 수정할 것 :FactoryGirl에서이 속성의 이전 값을 기반으로 속성을 설정하는 방법은 무엇입니까?

factory :photo_gallery do 
    photos { PhotosGenerator.generate_10_photos } 

    after(:build) do |photo_gallery| 
    # set value of some other attribute based on value of photos attribute 
    end 
end 

trait :non_broken do 
    photos { photos.reject(&:broken?) } # raises `stack level too deep (SystemStackError)` 
end 

당신이 SystemStackError을 제기시피. 공장에서이 속성에 대해 설정된 값을 기반으로 특성에 photos 속성 값을 설정하려면 어떻게해야합니까?

답변

0

공장에 추가 무시 속성을 추가하고 특성에 사진에 액세스하는 데 사용

factory :photo_gallery do 
    ignore do 
    temp_photos { PhotosGenerator.generate_10_photos } 
    end 

    photos { temp_photos } 
end 

trait :non_broken do 
    photos { temp_photos.reject(&:broken?) } # OK 
end 
0

나는 당신이 특성에서 당신의 사진 컬렉션을 "걸러 내면 안된다"라고 생각합니다. 대신에 필요한 것만 "구축"해야합니다.

trait :non_broken do 
    # build non_broken photos only 
end 
0

이 줄은 재귀 :

photos { photos.reject(&:broken?) } 

가 형질 상속을 좋아하지된다 당신은 "슈퍼"구현을 호출 할 수 없다. 대신 마지막으로 적용된 특성 만이 사용되는 유일한 구현 일 것이다. , 당신은 속성을 재정의하지 않을 있도록, 콜백을 사용할 수 있습니다, 또는

photos { PhotosGenerator.generate_10_photos(broken: false) } 

:

당신은 완전히 이전 구현을 참조하지 않고 photos 속성을 재정의하기 위해이 같은 일을해야합니다 이 설정되어있어 후에 당신은 그것을 변경하고 있습니다 :

trait :non_broken do 
    after :build do |object| 
    object.photos.reject!(&:broken?) 
    end 
end 
+0

공장에서 콜백 전후에 특성 콜백이 실행됩니까? –

+0

BTW 나는 무시 된 속성을 추가하는 것이 더 깨끗한 방법이라고 결정했다. –

관련 문제