2010-02-10 9 views
19

내 레일 응용 프로그램에 factory_girl 플러그인을 사용하고 있습니다. 각 모델에 대해 공장 데이터가 들어있는 해당 루비 파일이 있습니다.* 기타 * 공장에서 factory_girl 팩토리에 액세스

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    # t.user ??? 
end 

사용자 팩토리에는 이미 다양한 유형의 사용자가 있습니다. 그래도 난 다음을 시도 할 경우 :

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.user Factory(:valid_user) # Fails 
end 

을 나는 다음과 같은 오류가 발생합니다 :

# No such factory: valid_user (ArgumentError) 

: valid_user는하지만 실제로 유효 - 내 테스트에서 사용할 수 있습니다 - 그냥 내 공장에서. 여기에 다른 파일에 정의 된 팩토리를 사용할 수있는 방법이 있습니까? 당신은이 코드를 사용한다

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.association :valid_user 
end 

답변

4

처럼 연결 방법을 사용해보십시오

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.user { Factory(:valid_user) } 
end 

} {에서 전화를 포장하는 때까지 괄호의 내부 코드를 평가하지 않는 공장 소녀의 원인 : valid_thing 팩토리가 생성됩니다. 이렇게하면 : valid_user 팩토리가로드 될 때까지 기다려야합니다 (아직로드되지 않았으므로 예제가 실패합니다). 또한 새로운 : valid_user가 각각에 대해 생성됩니다 : 모든 사용자에 대해 동일한 사용자가 아닌 valid_thing : valid_thing (아마도 당신이 원하는 것입니다).

+0

당신도 할 수 있습니다 't.association : user, factory : : valid_user' – Kris

29

:

+10

이것은 잘 작동합니다. 'Factory (: valid_user)'구문이 더 이상 사용되지 않습니다. 'FactoryGirl.create (: valid_user)'를 대신 사용하십시오. –

+0

빌드 할 때 (: valid_thing)'create (: valid_user)'를 사용하면 실제로 create를 할 것인가? 이 참조를 만들기/빌드를 호출하는 방법에 따라 일반화 할 수있는 방법이 있습니까? – mpgarate

+0

@mpgarate - 아니요, 빌드하지 않습니다 –

3

잠재적으로 팩토리 걸의 새로운 기능은 질문의 나이로 판단되지만 공장의 속성 이름이 공장 이름과 동일한 경우 공장의 속성 이름을 호출하면 연관된 팩토리 생성으로 채 웁니다.

FactoryGirl.define do 
    factory :thing do 
    user 
    end 
end 

이렇게하면 사용자 필드가 동일한 이름의 팩토리를 찾고 그로부터 채워야합니다.

+0

이것은 나를 위해 일했다. –

관련 문제