2011-08-09 15 views
5

Próbuję użyć rspec do przetestowania filtr, który mam w moim ApplicationController.Testowanie aplikacjiController Filters, Rails

W spec/controllers/application_controller_spec.rb mam:

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 

Moim zamiarem było dla testu wyśmiewać akcję ajax, który ustawia lampę błyskową, a następnie sprawdzić na następny wniosek, że lampa została wyczyszczona.

Dostaję błąd routingu:

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

Jednak Spodziewam się, że istnieje wiele rzeczy źle z tym, jak próbuję to sprawdzić.

Dla porównania filtr jest nazywany w ApplicationController jak:

after_filter :no_xhr_flashes 

    def no_xhr_flashes 
    flash.discard if request.xhr? 
    end 

Jak utworzyć mock metod na ApplicationController przetestować szeroki filtr aplikacji?

Odpowiedz

8

Aby przetestować kontroler aplikacji przy użyciu protokołu RSpec, należy zastosować podejście RSpec anonymous controller.

Po prostu ustawiasz działanie kontrolera w pliku application_controller_spec.rb, które następnie mogą wykorzystać testy.

Dla powyższego przykładu może wyglądać podobnie.

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 
Powiązane problemy