如何最好地编写RSpec自定义匹配器来测试Rails应用程序中的访问控制



好吧,所以我不想写一大堆访问控制规范,也不想在我的许多规范文件中复制它们,而是想创建一个自定义的匹配器。因此,取而代之的是:

describe "access control" do
  it "should prevent access by non-logged-in users"
  it "should prevent access by normal users"
  it "should prevent access by editor users"
  it "should prevent access by admin users"
  it "should allow access by super admin users"
end

我想做这样的事情:

lambda do
  get :index
end.should have_access_control(:allowed => [:super_admin], :disallowed => [:admin, :editor, :user])

有什么例子或建议可以让我做这样的事情吗?

好吧,我找到了一种实现这一点的方法,尽管它不使用自定义匹配器。在spec_helper.rb:中包含以下代码

def access_control (code, options={})
  options = {:allow => [], :disallow => []}.merge(options)
  options[:allow].each do |user|
    it "#{code} should allow #{user.to_s}" do
      login_as(user)
      eval code
      response.should_not redirect_to(login_path)
    end
  end
  options[:disallow].each do |user|
    it "#{code} should disallow #{user.to_s}" do
      login_as(user)
      eval code
      response.should redirect_to(login_path)
    end
  end
end

并称之为:

access_control("get :index", {:allow => [:super_admin], :disallow => [:quentin, :admin]})

然后,您可以使用它来建立一个应该限制的方法的完整列表,以及它们被限制到的用户。

我不同意你的解决方案。测试不应该是一个像这样排除重复的领域。它使测试更难阅读,也更难维护。此外,肯定有一种观点认为,测试中的重复可以为您的设计提供信息。

在您列出的最初示例中,有5个不同的上下文,每个上下文都应该单独测试,并且能够一目了然。你的解决方案虽然巧妙,却损害了这两个目标。

最新更新