2

好的,所以我没有编写一大堆访问控制规范,并将它们复制到我的许多规范文件中,而是希望创建一个自定义匹配器。所以代替这个:

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])

有什么例子或建议可以说明我如何去做这样的事情吗?

4

2 回答 2

2

好的,我找到了实现这一点的方法,尽管它不使用自定义匹配器。在您的 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]})

然后,您可以使用它来构建应受限制的方法的完整列表,以及它们被限制的用户。

于 2008-10-14T10:03:37.217 回答
0

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

在您列出的初始示例中,有 5 种不同的上下文应单独进行测试,并且一目了然。您的解决方案虽然简洁,但会损害这两个目标。

于 2009-01-01T23:27:58.600 回答