1

現在取り組んでいる Ruby on Rails アプリがあり、機能テストで問題が発生しています。特に、テスト中に、同様の資格情報 (同じロールなど) を持つユーザーを介してログインしたときにブラウザーでアクセスできるページへのアクセスが拒否され続けます。たとえば、コントローラーのテストのコードは次のとおりです。

include Devise::TestHelpers
include Authorization::TestHelper
...
setup do
  @user = Factory(:user)
  @user.roles << Factory(:refinery_role)
  @user.roles << Factory(:agency_role)
  @user.save
  sign_in @user

  @agency = AgencyOrganization.create :name => "Test Agency"

  @adv1 = AdvertiserOrganization.create :name => "Test Advertiser", :parent => @agency

  UserOrganization.create :user_id => @user.id, :organization_id => @agency.id
end

test "agency user can edit advertiser" do
  assert @user.has_role? :agency #passes
  should_be_allowed_to :update, :advertiser_organizations #passes

  get :edit, {:id => @adv1.id}, {:agency_id => @agency.id}

  assert_equal "/unauthorized", request.env['PATH_INFO'] #passes :'(
  assert_template :edit #fails
  # and more tests we never get to
end

(明らかに、私が実際に確認したい主張はすべてではありませんが、何が起こっているかを示しています。)

価値があるのは、上記のテストが失敗し、次の例外が発生することです。

4) Failure:
test_agency_user_can_edit_advertiser(AdvertiserOrganizationsControllerTest [/Users/gworley/.rvm/gems/ruby-1.9.2-p180@portal/gems/declarative_authorization-0.5.1/lib/declarative_authorization/maintenance.rb:170]:
Exception raised:
<#<Authorization::NotAuthorized: No matching rules found for update for #<Authorization::GuestUser:0x00000101cda2b0 @role_symbols=[:guest]> (roles [:guest], privileges [:update, :manage], context :advertiser_organizations).>>.

繰り返しますが、私が言ったように、実際にアプリを実行しているときはすべてが機能し、テストが機能するだけです (アプリが偶然に機能しているだけかもしれませんが、誰にもわかりません)。

4

4 に答える 4

1

セットアップに欠けていますrequest.env["devise.mapping"] = Devise.mappings[:user]

詳細については、Devisewikiをご覧ください。個人的には、このログイン機能を別のモジュールに抽出し、要求に応じて含めます。すなわちlogin_user/login_agency_user

于 2011-07-12T20:40:13.647 に答える
1

Authorization.current_userを設定することを忘れないでください。そうしないと、DAは誰がサインインしたかを認識しません。

  def current_user
    @controller.current_user
  end
  def with_sign_in(u)
    sign_in u
    Authorization.current_user = current_user 
    yield
    sign_out u
    Authorization.current_user = nil
  end
于 2011-08-27T16:07:37.400 に答える
1

私は自分のアプリで Devise を使用していないため、これは暗闇でのショットですが、私たちが使用する認証システムには:user_id、セッションでセットアップするだけで、テストでセッション ハッシュによって破壊されるという特異性があります。

あなたのテストメソッドが:agency_idセッションで設定されていることに気付きました。

セッションハッシュを完全に削除して、取得したエラーが認証エラーではなく不在に関するものに置き換えられるかどうかを確認するか、:agency_idDevise が認証に使用するセッション変数をハッシュに追加してみてください。

于 2011-07-19T05:51:43.673 に答える
0

失敗するのは認証(あなたが誰であるか)ですか、それとも承認(何をすることが許可されているか) ですか? 認証が失敗した場合は、使用している declarative_authorization gem に問題がある可能性があります。認証の問題である場合は、Devise gem または Devise TestHelpers に問題がある可能性があります。この同様の質問が役立つ場合があります。何も機能しない場合は、このように認証をスタブ化することも可能です

  before :each do
    @current_user = Factory(:user)
    controller.stub!(:current_user).and_return(@current_user)
    controller.stub!(:user_signed_in?).and_return(:true)
    controller.stub!(:authenticate_user!).and_return(:true)
  end
于 2011-07-19T13:48:53.417 に答える