2012-01-11 12 views
8

ApplicationController:Rails + rspec + idee = método indefinido `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 

Resultado:

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

Carriles versión: 3.1.3

versión Rspec: Versión 2.8.0

Diseñar: 1.5.3

Nota: También creé el soporte de archivos/deviser.rb pero eso no ayuda. ¿Algunas ideas?

+1

El [idear Wiki] (https://github.com/plataformatec/devise/wiki/How-To:-Controllers-and-Views-tests-with-Rails-3- (and-rspec)) proporciona un algunas formas diferentes de integrar el diseño con rspec. –

Respuesta

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 

Actualización:

El uso anterior de sintaxis con el último rspec dará a continuación la advertencia

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)>'. 

Utilice esta nueva sintaxis

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

Encontré la línea 'controller.stub (: authenticate_user!) And_return true' muy útil. Sin embargo, la línea 'include Devise :: TestHelpers' es innecesaria y engañosa. No se utilizan métodos de 'Devise :: TestHelpers' aquí, y una razón para stub' authenticate_user! 'En primer lugar es evitar un acoplamiento con la maquinaria de Devise. – evanrmurphy

+1

@evanrmurphy yeap, tienes toda la razón, no sé lo que esto incluye hacer en mi respuesta, lo eliminaré :) –

7

nombre de su modelo algo distinto ¿Usuario? Si es, por ejemplo, Admin, entonces necesita cambiar su filtro a:

before_filter :authenticate_admin! 

Esto me mordió por un tiempo; Comencé con el usuario como mi modelo y luego decidí agregar Devise a un modelo llamado Member en su lugar, pero dejé el :authenticate_user! original en mi controlador y seguí recibiendo ese error al ejecutar RSpec.

+0

gracias gracias ¡gracias! –

3

Parece que la mejor manera de hacerlo es la siguiente en el archivo spec_helper.rb:

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

Véase el rspec wiki para más detalles.

1

En mi caso había olvidado que comenté la línea devise_for en mi archivo routes.rb.

Cuestiones relacionadas