测试ApplicationController过滤器,Rails

时间:2011-08-09 02:01:55

标签: ruby-on-rails ruby-on-rails-3 unit-testing rspec

我正在尝试使用rspec来测试我在ApplicationController中的过滤器。

spec/controllers/application_controller_spec.rb我有:

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

我的目的是测试模拟设置闪存的ajax操作,然后在下一个请求中验证闪存已被清除。

我收到路由错误:

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

但是,我希望我试图测试这个问题有多少错误。

作为参考,过滤器在ApplicationController中调用为:

  after_filter :no_xhr_flashes

  def no_xhr_flashes
    flash.discard if request.xhr?
  end

如何在ApplicationController上创建模拟方法来测试应用程序范围的过滤器?

1 个答案:

答案 0 :(得分:8)

要使用RSpec测试应用程序控制器,您需要使用RSpec anonymous controller方法。

您基本上在application_controller_spec.rb文件中设置了一个控制器操作,测试可以使用该操作。

对于上面的示例,它可能看起来像。

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