2011-06-19 21 views
18

De acuerdo con this del wiki previsto, debería ser capaz de utilizar un método de ayuda de login_user en mis pruebas de controlador. En consecuencia, he lo siguiente dentro de la guía de especificaciones:rspec & inventar ayudantes de prueba

#spec_helper.rb 
... 
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} 

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

y

#support/controller_macros.rb 
module ControllerMacros  
    def login_user 
    before(:each) do 
     @request.env["devise.mapping"] = Devise.mappings[:user] 
     @user = Factory.create(:user) 
     sign_in @user 
    end 
    end 
end 

embargo llamando al ayudante no funciona:

#requests/some_spec.rb 
require 'spec_helper' 
describe "GET /guides/edit" do 
    login_user  
end 

Puede alguien punto hacia donde voy incorrecto. El conjunto de pruebas funciona a partir de esto. Obtengo un mensaje de variable o método local indefinido, así que supongo que el módulo no se incluye.

Rails 3.0.7 rspec 2.6.0 legado 1.3.4

backtrace

+0

¿Eso es un error en su some_spec.rb? 'log_in' /' login_user' – Dogbert

+0

Vaya, lo siento. Fijo. – mark

+1

¿Cuál es la traza inversa que obtienes? –

Respuesta

18

Imagino que hay un par de problemas con este enfoque. Lo primero es que está utilizando las especificaciones de solicitud, no las especificaciones del controlador, por lo que el método login_user no está disponible en config.extend ControllerMacros, :type => :controller. En segundo lugar, incluso si puede incluir el método, lo más probable es que no funcione, ya que los ayudantes de prueba de Devise se escriben específicamente para pruebas de control/vista, no pruebas de integración.

Eche un vistazo a David Chelimsky's answer a this SO question, que puede ser de ayuda.

+0

Gracias zetetic. Estás completamente en lo correcto, estaba confundiendo las especificaciones del controlador y la solicitud. La respuesta vinculada funciona perfectamente. – mark

+0

Cómo cerrar sesión de sesión en las especificaciones. – aashish

4

No puedo responder a ciencia cierta ... pero el olor de código para mí es el "antes (: cada uno) "definido dentro del ayudante. ¿por qué no pruebas:

#support/controller_macros.rb 
module ControllerMacros  
    def login_user 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    @user = Factory.create(:user) 
    sign_in @user 
    end 
end 

y

#requests/some_spec.rb 
require 'spec_helper' 
describe "GET /guides/edit" do 
    before(:each) do 
    login_user  
    end 
end 

y si eso no funciona - Es posible que simplemente no puede encontrar @request - en cuyo caso, lo pasa como una variable a login_user

Editar:

Parece que podría necesitar incluir los ayudantes de prueba. El rdoc dice que debe tener este archivo:

# spec/support/devise.rb 
RSpec.configure do |config| 
    config.include Devise::TestHelpers, :type => :controller 
end 

No sé si esto se diferencia de la forma en que ya lo tienes en spec_helper.rb ... se ve muy similar a mí.

+0

Gracias por su respuesta. Lo intenté pero siempre es la variable/error del método que falta lo que parece sugerir que el módulo no está incluido en absoluto. – mark

+0

Hmm, lo siento, lo uso con Test :: Unit (aunque uso rspec en otro proyecto), así que solo estoy adivinando ... ¿Quizás podría requerir 'idear' en spec_helper.rb? –

+0

incluyen Devise :: TestHelpers –

0

Tengo el mismo problema con Rails 3.0.10 rspec 2.6.0 diseño 1.3.4 spork-0.9.0.rc9 en las especificaciones de mi controlador, he cambiado config. extend a y su trabajo!

0

Olvide confirmar si su aplicación no es confirmable. Su código debe verse como

module ControllerMacros 
    def login_user 
    before(:each) do 
     @request.env["devise.mapping"] = Devise.mappings[:user] 
     user = FactoryGirl.create(:user) 
     #user.confirm! # or set a confirmed_at inside the factory. Only necessary if you are using the confirmable module 
     sign_in user 
    end 
    end 
end 
Cuestiones relacionadas