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

OK、これを達成する方法を見つけましたが、カスタムマッチャーは使用していません。次のコードを 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 つの異なるコンテキストがあります。あなたの解決策はきちんとしていますが、これらの 2 つの目標を損なうものです。

于 2009-01-01T23:27:58.600 に答える