如何测试before_filter是否会重定向所有Rails控制器操作?

时间:2011-02-22 23:46:46

标签: ruby-on-rails testing shoulda before-filter

我的一个控制器中有一个相当典型的require_no_user作为before_filter。我需要测试一个登录用户是否被这个过滤器重定向,如果他们试图访问控制器操作的任何

如果不在我的测试用例中列举所有控制器的操作,是否有一种明智的方法可以做到这一点?

我试图避免:

context 'An authenticated user' do
  setup do
    activate_authlogic
    @user = Factory(:user)
    UserSession.create(@user)
  do

  should 'not be allowed to GET :new' do
    get :new
    assert_redirected_to(root_path)
  end

  should 'not be allowed to POST :create' do
    # same as above
  end

  # Repeat for every controller action
end

1 个答案:

答案 0 :(得分:2)

不是我知道的......虽然你可以通过将所有方法和操作打包成哈希来缩短它:

should "be redirected" do
  {
    :get => :new,
    :post => :create,
  }.each do |method, action|
    send(method, action)
    assert_redirected_to(root_path)
  end
end

编辑:所以是的,这可能是矫枉过正,但这是另一种方式:

should "be redirected" do
  ActionController::Routing::Routes.named_routes.routes.each do |name, route|
    if route.requirements[:controller] == @controller.controller_name
      send(route.conditions[:method], route.requirements[:action])
      assert_redirected_to(root_path)
    end
  end
end

虽然如果你在自定义路线中定义多个:方法,它仍然只能“找到”第一个,例如,

map.resources :foo, :collection => {
  :bar => [:get, :post]
}

上述路线只会尝试使用GET动词。

此外,如果URL中存在其他要求,例如存在记录ID,我的天真示例将忽略该要求。我把它留给你来解决:)