2011-02-03 16 views
6

Jestem nowy w Rspec i próbuję skonfigurować test dla profilu użytkownika. Profil należy do użytkownika.Röck Kodowanie: ActiveRecord :: AssociationTypeMismatch

Teraz mam integrację API z witryną strony trzeciej, która działa przez Model użytkownika, ale niektóre informacje dotyczące tego linku API są zawarte w profilu, więc mam filtr "after_update" w profilu, który informuje użytkownik macierzysty do zapisania, co powoduje aktualizację interfejsu API.

Próbuję napisać test na to i otrzymuję ActiveRecord :: AssociationTypeMismatch. Powodem jest to, że używam fałszywego użytkownika, ale próbuję przetestować, że gdy profil jest zaktualizowany, wysyła: zapisz do użytkownika. Dodatkowo, model użytkownika ma proces potwierdzania adresu e-mail i związane z nim wywołania API w procesie tworzenia, więc naprawdę nie jest to idealne rozwiązanie, aby stworzyć użytkownika, aby to przetestować.

Oto moja próba:

it "should save the parent user object after it is saved" do 
    user = double('user', :save => true) 
    profile = Profile.create(:first_name => 'John', :last_name => 'Doe') 
    profile.user = user 

    user.should_receive(:save) 
end 

więc wyraźnie błąd ActiveRecord jest spowodowane próbuje powiązać mock użytkownika z profilem, który oczekuje prawdziwy użytkownik może wiązać.

Moje pytanie brzmi: jak uniknąć tego rodzaju problemów podczas pisania testów szyn? Wszystko, co chcę zrobić, to sprawdzenie, czy wywołania profilu: zapisz na rodzica użytkownika. Czy istnieje inteligentniejszy sposób to zrobić, lub obejście dla błędu ActiveRecord?

Dzięki!

+0

Osobiście użyłbym czegoś takiego jak factory_girl, aby stworzyć już potwierdzony obiekt User, a następnie ustawić oczekiwanie "save" na tym. Nie jesteś w stanie sfałszować potwierdzonego użytkownika bez przechodzenia przez proces e-mail? To uruchamia pewne alarmy w odniesieniu do projektu kodu. –

+0

Cóż, twoja sugestia zakończyła się tak, jak musiałem iść. Udało mi się wyodrębnić API, którego nie chciałem wywołać, mówiąc kontrolerowi, aby nie uruchamiał tego wywołania w środowisku testowym, aby umożliwić mi pracę z obiektami Factory zgodnie z oczekiwaniami. Jednak musiałem włączyć działania API z powrotem, aby przetestować integracje, więc w końcu porzuciłem to podejście i pozwalam środowisku piaskownicy na uzyskanie przez API pełnego niepotrzebnych danych, które muszę okresowo usuwać. Nie to, co bym chciał, ale pozwala mi to sprawdzić. – Andrew

Odpowiedz

3

znalazłem jedyny sposób udało mi się ominąć ten problem był w użyciu przez użytkownika fabryczne zamiast makiety. To frustrujące, ale podczas testowania połączeń zwrotnych między dwoma modelami ActiveRecord trzeba korzystać z rzeczywistych modeli, inaczej zapisywanie połączeń nie powiedzie się, cykl życia się nie powiedzie, a wywołań zwrotnych nie można przetestować.

+0

Czy wezwania zwrotne nie powinny być testowane w odpowiedniej specyfikacji modelu? – Starkers

11

powinny mieć możliwość korzystania z mock_model na to:

it "should save the parent user object after it is saved" do 
    user = mock_model(User) 
    user.should_receive(:save).and_return(true) 
    profile = Profile.create(:first_name => 'John', :last_name => 'Doe') 
    profile.user = user 
end 
+0

Próbowałem tego i nie zadziałało. – Andrew

+2

Co konkretnie? – zetetic

+0

To działa. Dzięki! –