2010-11-27 10 views
16

Actualmente estoy intentando probar un controlador de sesión Devise personalizado con rspec. Mi controlador se ve así:Prueba de RSpec del controlador de sesión de diseño personalizado falla con AbstractController :: ActionNotFound

class SessionsController < Devise::SessionsController 

    def create 
    #valid email? 
    if !(params[:email] =~ /^[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,}$/) 
     set_flash_message :notice, "Please enter a valid e-mail address!" 
    end 

    super 
    end 
end 

mi prueba del controlador RSpec es la siguiente:

require 'spec_helper' 
require 'devise/test_helpers' 

describe SessionsController do 

    it "should put a warning on invalid mail address login attempt" do 
    post :create, :user => {:email => 'invalidEmailAddress'} 
    response.should contain "Please enter a valid e-mail address!" 
    end 

    it "should put no warning on valid mail address login attempt" do 
    pending 
    end 
end 

Si ejecuto la prueba RSpec falla con la siguiente línea:

Failure/Error: post :new, :user => {:email => 'invalidEmailAddress'} 
    AbstractController::ActionNotFound 
    # ./spec/controllers/sessions_controller_spec.rb:7 

Consejos del plataformatec Devise Wiki así como this post no resolvió este problema. Gracias por tu ayuda.

adición

que investigarse más. Yo era realmente capaz de "eliminar" el error con la siguiente adición al controlador de especificaciones:

before(:each) do 
    request.env['devise.mapping'] = Devise.mappings[:user] 
end 

Pero ahora aparece un nuevo error:

Failure/Error: post :create #currently fails with multiple render warning 
Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return". 

Incluso con el método de crear dejado fuera de la heredera controlador aparece el error El error no aparece en get: nuevo, por ejemplo. Parece ser una publicación: solo crear. ¿Me he quedado sin ideas? ¿Alguna ayuda? Gracias!

Respuesta

18

Finalmente resolví mi problema haciendo incluyendo los ayudantes de prueba, llamando al método setup_controller_for_warden en mi prueba Y haciendo request.env ["devise.mapping"] = Devise.mappings [: user]. De este modo:

require 'test_helper' 

class SessionsControllerTest < ActionController::TestCase 
    include Devise::TestHelpers 

    test "should reject invalid captcha" do 
     setup_controller_for_warden 
     request.env["devise.mapping"] = Devise.mappings[:user] 

     get :new 

     assert_response :success 
    end 
end 

No está seguro acerca de su doble rendir problema, sin embargo, ¿estás seguro de que su supuesta llamar mensaje: crear luego hacer? No estoy seguro de cómo se espera que rspec funcione.

+0

'render' es para ver las especificaciones: no tiene sentido en las especificaciones del controlador, que no representan las vistas por defecto. Hay una directiva 'render_views' (que reemplaza a la antigua" integrate_views ") en caso de que desee que el controlador de prueba realice la representación. – zetetic

+0

Ok, tienes razón. Pero incluso sin la representación explícita, el error ocurre. Render nunca fue alcanzado en mi código anterior. – kaihowl

+0

Gracias por su respuesta. Probé tus sugerencias, pero ninguna de ellas funcionó para mí. Lamentablemente, los mismos errores aparecen una y otra vez. – kaihowl

Cuestiones relacionadas