2010-09-15 7 views
6

Próbuję wyodrębnić metodę na moim current_user (przy użyciu zmodyfikowanego auth rozwiązania restful_authentication) z rspec. Nie jestem całkowicie pewien, w jaki sposób mogę uzyskać dostęp do tej metody w mojej specyfikacji kontrolera. current_user samo nie działa. Czy muszę najpierw pobrać kontroler? Jak mam to zrobic?Dostęp do metod aplikacji RSpec, takich jak "current_user"

Korzystanie rails 2.3.5, rspec 1.3.0 i rspec-rails 1.3.2

# my_controller_spec.rb 
require 'spec_helper' 

describe MyController do 

    let(:foos){ # some array of foos } 

    it "fetches foos of current user" do 
    current_user.should_receive(:foos).and_return(foos) 
    get :show 
    end 
end 

Produkuje

NoMethodError in 'ChallengesController fetches foos of current user' 
undefined method `current_user' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_1::Subclass_1::Subclass_2::Subclass_2:0x7194b2f4> 

Odpowiedz

2

rspec barierki daje controller metodę stosowania w przykładach kontrolera. Więc:

controller.stub!(:current_user).with(:foos).and_return(foos)

powinien działać.

+0

niesamowite, będę to sprawdzić się, przy okazji, jaka jest różnica pomiędzy ' stub' and 'stub!' – brad

+1

Brak - 'stub' jest aliasem dla' stub! ', więc są one zamienne – zetetic

+0

zadziałało! thx a bunch – brad

0

Nie jestem zaznajomiony z restful_authentication tylko Authlogic i opracowania, ale to chyba podobna w tym current_user to metoda kontroler a nie obiekt, dlatego wywołanie na nim should_receive nie działa zgodnie z oczekiwaniami (ustawiasz oczekiwanie na obiekcie, że current_userzwraca, ale metoda nie jest dostępna w zakresie oczekiwań).

Spróbuj tego:

stub!(:current_user).and_return(foos)

+0

nie mogłem go t owork z tylko odgałęzienie() Potrzebowałem controller.stub jak wspomniano powyżej – brad

1

Skąd wiadomo, gdzie można znaleźć current_user? powinno to rozwiązać:

subject.current_user.should_receive(:foos).and_return(foos) 
0

Przeczytałem to i nieco poprawiłem. Jeśli chcesz po prostu przejść w obiekcie użytkownika do testu rspec, można użyć tego:

  1. Najpierw należy utworzyć obiekt użytkownika w obrębie rspec testu. Na przykład: (. Użyj wszelkimi atrybutami, które potrzebują lub są wymagane do utworzenia obiektu użytkownika)

    user = User.create (nazwa: „Ted”)

    (Uwaga: Można również skorzystać z fabryki FactoryGirl)

  2. teraz, z tego obiektu użytkownika, który jest zapisany w zmiennej "user", należy to zrobić w tym samym teście rspec:.!

    controller.stub (: current_user) .and_return (użytkownik)

który powinien działać ...

Powiązane problemy