Как лучше всего написать пользовательское сопоставление RSpec для проверки контроля доступа в приложении Rails - PullRequest
2 голосов
/ 13 октября 2008

ОК, поэтому вместо того, чтобы писать целую кучу спецификаций контроля доступа и дублировать их во многих моих файлах спецификаций, я ищу создание пользовательского сопоставления. Так что вместо этого:

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

Есть ли примеры или предложения о том, как я могу сделать что-то подобное?

Ответы [ 2 ]

2 голосов
/ 14 октября 2008

ОК, Я нашел способ достижения этого , хотя он не использует пользовательское сопоставление. Включите следующий код в ваш 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]})

Затем вы можете использовать его для создания полного списка методов, которые должны быть ограничены, и пользователей, для которых они ограничены.

0 голосов
/ 02 января 2009

Я не согласен с вашим решением. Тесты не должны быть областью для устранения дублирования. Это затрудняет чтение тестов и усложнение их сопровождения. Кроме того, безусловно, есть аргумент, что дублирование в тестах может сообщить вашему дизайну .

В первоначальном примере, который вы перечислили, есть 5 различных контекстов, каждый из которых должен тестироваться изолированно и быть понятным с первого взгляда. Ваше правильное решение вредит этим двум целям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...