2012-01-11 18 views
8

ApplicationController:Rails + rspec + devise = metodo non definito `authenticate_user! '

class ApplicationController < ActionController::Base 
    before_filter :authenticate_user! 

    protect_from_forgery 
end 

DashboardsController:

class DashboardsController < ApplicationController 
    def index 
    end 

end 

DashboardsControllerSpec:

require 'spec_helper' 
describe DashboardsController do 
    include Devise::TestHelpers 

    describe "GET 'index'" do 
    it "returns http success" do 
     get 'index' 
     response.should be_success 
    end 
    end 
end 

Risultato:

Failure/Error: get 'index' 
    NoMethodError: 
     undefined method `authenticate_user!' for #<DashboardsController:0x007fef81f2efb8> 

Rotaie Versione: 3.1.3

versione Rspec: versione 2.8.0

Devise: 1.5.3

Nota: Ho anche creato il supporto dei file/deviser.rb ma questo non aiuta. Qualche idea?

+1

Il [devise Wiki] (https://github.com/plataformatec/devise/wiki/How-To:-Controllers-and-Views-tests-with-Rails-3- (and-rspec)) fornisce un alcuni modi diversi di integrare escogitare con rspec. –

risposta

12
require 'spec_helper' 
describe DashboardsController do 
    before { controller.stub(:authenticate_user!).and_return true } 
    describe "GET 'index'" do 
    it "returns http success" do 
     get 'index' 
     response.should be_success 
    end 
    end 
end 

Aggiornamento:

Utilizzando sopra della sintassi con le ultime RSpec darà seguito avvertimento

Using `stub` from rspec-mocks' old `:should` syntax without explicitly enabling the syntax is deprecated. Use the new `:expect` syntax or explicitly enable `:should` instead. Called from `block (2 levels) in <top (required)>'. 

Usare questa nuova sintassi

before do 
    allow(controller).to receive(:authenticate_user!).and_return(true) 
    end 
+0

Ho trovato molto utile la riga 'controller.stub (: authenticate_user!). And_return true'. Tuttavia, la riga 'include Devise :: TestHelpers' non è necessaria e fuorviante. Qui non vengono utilizzati metodi di 'Devise :: TestHelpers', e uno dei motivi per bloccare" authenticate_user! "In primo luogo è evitare un accoppiamento con la macchina di Devise. – evanrmurphy

+1

@evanrmurphy yeap, hai perfettamente ragione, non so cosa significhi fare nella mia risposta, lo rimuoverò :) –

7

È il nome del modello qualcosa di diverso Utente? Se è per es. Amministratore, quindi è necessario modificare il filtro per:

before_filter :authenticate_admin! 

Questo mi ha un po 'per un po'; Ho iniziato con Utente come mio modello e in seguito ho deciso di aggiungere Devise a un modello chiamato Member, ma ho lasciato l'originale :authenticate_user! nel mio controller e continuavo a ricevere quell'errore durante l'esecuzione di RSpec.

+0

grazie grazie grazie! –

3

Sembra che il modo migliore per farlo è la seguente nel file spec_helper.rb:

RSpec.configure do |config| 
    config.include Devise::TestHelpers, :type => :controller 
end 

Vedere la rspec wiki per maggiori dettagli.

1

Nel mio caso mi ero dimenticato di aver commentato la linea devise_for nel mio file routes.rb.

Problemi correlati