2012-06-12 8 views
8

Nella nostra app rails 3.1.4, rspec viene utilizzato per testare il metodo pubblico require_signin nel controller dell'applicazione. Ecco il metodo require_signin:RunTimeError: ActionController :: RackDelegation in rspec 2.10.1 per rails 3.1.4 controller dell'applicazione

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

ecco il codice rspec:

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

È possibile che questo rspec genera gigantesco errore a più pagine che iniziano come di seguito:

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>, ........ 

Cosa c'è di sbagliato con il codice rspec? Grazie mille.

+0

Aggiungere una taglia per favore. Ho bisogno anche di questa risposta – tekknolagi

risposta

0

Potrebbe non essere del tutto utile, ma sono venuto qui dopo aver ottenuto lo stesso errore. Ho iniziato con una suite di test di passaggio, fatto alcune modifiche, e poi ha iniziato a ricevere errori come:

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

Dopo aver dato un'occhiata più da vicino l'errore, ho notato che ha detto da qualche parte:

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

I aveva appena aggiunto l'opzione :confirmable in Devise e mi sono reso conto che tutti gli utenti che ho creato che stavo cercando di accedere non erano confermati, e in quanto tale non potevano accedere correttamente. Avevo bisogno di aggiungere confirmed_at Time.now alla mia creazione factory/fixture per gli utenti . Nel tuo esempio, sembra che tu stia provando a testare quando non hai effettuato l'accesso, quindi non sono sicuro che sia necessariamente applicabile.

3

Mi sono imbattuto in questo errore e mi sono reso conto che stavo attivando un reindirizzamento sul controller chiamando un metodo di supporto che volevo testare, ma in realtà non avevo ancora istanziato una richiesta di test. Chiamando il numero get :index prima di chiamare l'aspettativa, è stato eliminato l'errore.

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

Grazie dal futuro! Questo ha corretto il problema per me. – taylorthurlow

0

Se si desidera controllare la meccanica di azione, è necessario utilizzare should_receive prima di una chiamata send come questo

it "should redirect to signin_path" do 
    controller.should_receive(:redirect_to).with(signin_path) 
    controller.send(:require_signin) 
end 
Problemi correlati