我想用rspec指定我的控制器before_filter.
我想为它使用ActionController :: Testing :: ClassMethods#before_filters.
我想为它使用ActionController :: Testing :: ClassMethods#before_filters.
我在导轨c中得到了这些结果:
2.0.0p353 :006 > ActionController::Base.singleton_class.send :include,ActionController::Testing::ClassMethods 2.0.0p353 :003 > EquipmentController.before_filters
=> [:process_action,:process_action]
但实际上这是我行动的过滤器:
class EquipmentController < ApplicationController before_filter :authenticate_user!
有任何想法吗?
解决方法
这就是我在项目中所做的:
# spec/support/matchers/have_filters.rb RSpec::Matchers.define :have_filters do |kind,*names| match do |controller| filters = controller._process_action_callbacks.select{ |f| f.kind == kind }.map(&:filter) names.all?{ |name| filters.include?(name) } end end # spec/support/controller_macros.rb module ControllerMacros def has_before_filters *names expect(controller).to have_filters(:before,*names) end end # spec/spec_helper.rb RSpec.configure do |config| config.include ControllerMacros,type: :controller end
然后你可以在控制器规格中使用它,例如:
# spec/controllers/application_controller_spec.rb require 'spec_helper' describe ApplicationController do describe 'class' do it { has_before_filters(:authenticate_user) } end end