2011-08-09 20 views
5

Estoy tratando de usar rspec para probar un filtro que tengo en mi ApplicationController.Prueba ApplicationController Filters, Rails

En spec/controllers/application_controller_spec.rb que tengo:

require 'spec_helper' 
describe ApplicationController do 
    it 'removes the flash after xhr requests' do  
     controller.stub!(:ajaxaction).and_return(flash[:notice]='FLASHNOTICE') 
     controller.stub!(:regularaction).and_return() 
     xhr :get, :ajaxaction 
     flash[:notice].should == 'FLASHNOTICE' 
     get :regularaction 
     flash[:notice].should be_nil 
    end 
end 

Mi intención era para la prueba de burlarse de una acción ajax que establece el flash, y luego verificar en la siguiente petición de que el flash se borra.

estoy recibiendo un error de enrutamiento:

Failure/Error: xhr :get, :ajaxaction 
ActionController::RoutingError: 
    No route matches {:controller=>"application", :action=>"ajaxaction"} 

Sin embargo, esperamos que haya un múltiplo cosas mal con la forma en que estoy tratando de probar esto.

de remisión, el filtro se denomina en ApplicationController como:

after_filter :no_xhr_flashes 

    def no_xhr_flashes 
    flash.discard if request.xhr? 
    end 

¿Cómo puedo crear métodos simulacros en ApplicationController para poner a prueba una amplia filtro de aplicación?

Respuesta

8

Para probar un controlador de aplicación utilizando RSpec, necesita utilizar el enfoque RSpec anonymous controller.

Básicamente, configura una acción de controlador en el archivo application_controller_spec.rb que las pruebas pueden usar.

Para su ejemplo anterior, podría ser algo así como.

require 'spec_helper' 

describe ApplicationController do 
    describe "#no_xhr_flashes" do 
    controller do 
     after_filter :no_xhr_flashes 

     def ajaxaction 
     render :nothing => true 
     end 
    end 

    it 'removes the flash after xhr requests' do  
     controller.stub!(:ajaxaction).and_return(flash[:notice]='FLASHNOTICE') 
     controller.stub!(:regularaction).and_return() 
     xhr :get, :ajaxaction 
     flash[:notice].should == 'FLASHNOTICE' 
     get :regularaction 
     flash[:notice].should be_nil 
    end 
    end 
end 
Cuestiones relacionadas