确定这样的,而不是写一大堆的访问控制规范,并在许多我的规格文件中复制它们,我希望创建一个自定义匹配。因此,而不是这样的:

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个不同的上下文。您的解决方案,而整洁,损害了这两个目标。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top