2012-06-12 10 views
8

W naszej aplikacji szynowej 3.1.4, rspec jest używany do testowania publicznej metody require_signin w kontrolerze aplikacji. Oto require_signin metoda:RunTimeError: ActionController :: RackDelegation w rspec 2.10.1 dla szyn 3.1.4 kontroler aplikacji

def require_signin 
    if !signed_in? 
     flash.now.alert = "Log in first!" 
     redirect_to signin_path 
    end 
    end 

Oto kod rspec:

it "should invoke require_signin for those without login" do 
    controller.send(:require_signin) 
    controller {should redirect_to signin_path} 
end 

Powyższy rspec generuje gigantyczny Multi stron błędu zaczynając jak poniżej:

RuntimeError:←[0m 
     ←[31mActionController::RackDelegation#status= delegated to @_response.status=, but @_response is nil: #<ApplicationController:0x3 
a67f10 @_routes=nil, @_action_has_layout=true, @_view_context_class=nil, @_headers={"Content-Type"=>"text/html"}, @_status=200, @_reques 
t=#<ActionController::TestRequest:0x3a68720 @env={"rack.version"=>[1, 1], "rack.input"=>#<StringIO:0x34fad60>, ........ 

Co może być źle z kodem rspec? Dzięki wielkie.

+0

Dodaj bounty proszę. Ja też potrzebuję tej odpowiedzi – tekknolagi

Odpowiedz

0

Może nie być w pełni przydatny, ale przybyłem tutaj po tym samym błędzie. Zacząłem z przejeżdżającego zestawu testowego, dokonaliśmy pewnych zmian, a następnie rozpoczęła się błędy jak:

RuntimeError: 
    ActionController::RackDelegation#status= delegated to @_response.status=, but @_response is nil: 
    ...many lines... 

Po bliżej przyjrzeć się błędu, zauważyłem, że powiedział, że gdzieś:

@flashes={:alert=>"You have to confirm your account before continuing."} 

I Właśnie dodałem opcję Dewise w wersji :confirmable i zdałem sobie sprawę, że wszyscy użytkownicy, których próbowałem się zalogować, byli niepotwierdzeni, a jako taki nie mogłem się zalogować. Potrzebowałem dodać confirmed_at Time.now do mojego stworzenia fabryki/urządzenia dla użytkowników . Jednak w twoim przykładzie wygląda na to, że próbujesz sprawdzić, kiedy nie jesteś zalogowany, więc nie jestem pewien, czy jest to konieczne.

3

Natknąłem się na tę pomyłkę i zdałem sobie sprawę, że wywołałem przekierowanie na kontrolerze, wywołując metodę pomocniczą, którą chciałem przetestować, ale nie stworzyłem jeszcze żądania wystąpienia testu. Dzwoniąc pod numer get :index przed wywołaniem oczekiwań pozbyłem się błędu.

it "redirects if some condition" do 
    subject.send(:helper_method) 
    get :action # <= Need this before setting expectation below 
    response.should redirect_to("/somewhere") 
end 
+0

Dzięki z przyszłości! To właśnie naprawiło problem dla mnie. – taylorthurlow

0

Jeśli chcesz sprawdzić mechanikę działania, należy użyć should_receive przed send rozmowy jak ta

it "should redirect to signin_path" do 
    controller.should_receive(:redirect_to).with(signin_path) 
    controller.send(:require_signin) 
end 
Powiązane problemy