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!
'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
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
Gracias por su respuesta. Probé tus sugerencias, pero ninguna de ellas funcionó para mí. Lamentablemente, los mismos errores aparecen una y otra vez. – kaihowl