我正在尝试使用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
上创建模拟方法来测试应用程序范围的过滤器?
答案 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