2011-09-20 29 views
7

Używam Ruby na Railsach 3.0.9, RSpec-rails 2 i FactoryGirl. Próbuję podać model stowarzyszenia Factory, ale mam kłopoty.Problemy z modelem stowarzyszenia FactoryGirl: "SystemStackError: zbyt duży poziom stosu"

Mam pliku jak factories/user.rb następujące:

FactoryGirl.define do 
    factory :user, :class => User do 
    attribute_1 
    attribute_2 
    ... 

    association :account, :factory => :users_account, :method => :build, :email => '[email protected]' 
    end 
end 

i plik jak factories/users/account.rb następujące:

FactoryGirl.define do 
    factory :users_account, :class => Users::Account do 
    sequence(:email) {|n| "foo#{n}@bar.com" } 
    ... 
    end 
end 

Powyższy przykład działa zgodnie z oczekiwaniami w moich plikach spec ale jeśli w instrukcji factory :users_account dodaję kod association :user, aby mieć

FactoryGirl.define do 
    factory :users_account, :class => Users::Account do 
    sequence(:email) {|n| "foo#{n}@bar.com" } 
    ... 
    association  :user 
    end 
end 

pojawia się następujący błąd:

Failure/Error: Unable to find matching line from backtrace 
SystemStackError: 
    stack level too deep 

Jak mogę rozwiązać ten problem tak, aby dostęp do powiązanych modeli z obu stron \ fabryk (czyli w moich plików spec chciałbym użyć stowarzyszenie ROR metody modelowania, takie jak user.account i account.user) ?

P.S .: Przeczytałem pytanie Factory Girl and has_one, a moja sprawa jest bardzo zbliżona do przypadku wyjaśnionego w połączonym pytaniu. To znaczy, mam również skojarzenie has_one (między klasami User i Users::Account).

+0

Po prostu ciekawy, masz "użytkownika", a następnie masz "Użytkownicy :: Konto", czy to ma być liczba mnoga, czy powinno to być 'Użytkownik :: Konto" lub literówka? – nowk

+0

@kwon - To nie jest literówka. Mam klasę "Użytkownicy :: Konto". – Backo

Odpowiedz

14

Według the docs, nie można po prostu umieścić obu stron skojarzeń w fabrykach. Będziesz musiał użyć ich po wywołaniu zwrotnym, aby ustawić obiekt (y) do zwrócenia.

Na przykład w pliku factories/users/account.rb, można umieścić coś takiego

after(:build) do |user_account, evaluator| 
    user_account.user = FactoryGirl.build(:user, :account=>user_account) 
end 

stowarzyszeń has_many, musisz korzystać z ich * funkcje _list.

after(:build) do |user_account, evaluator| 
    user_account.users = FactoryGirl.build_list(:user, 5, :account=>user_account) 
end 

Uwaga: wierzę, że przykład w docs jest nieco mylące, to nic nie do obiektu przypisać. Uważam, że powinno to być coś w stylu (zanotuj zadanie).

Powiązane problemy