ruby-on-rails – 我如何指定before_filters?

我想用rspec指定我的控制器before_filter.
我想为它使用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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...