1

アプリケーションスタック: Rails3、CanCan、Devise、Shoulda

ネストされたリソースがいくつかあり、Shoulda でテストしたいのですが、次の DoubleRenderError が発生します。

Error:
test: If anonymous user tries to GET index of fav_blogs should respond with 401.    (BlogItemsControllerTest):
AbstractController::DoubleRenderError: Render and/or redirect were called multiple times  in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".

このテストでは、認証されていないユーザーがネストされたリソースにアクセスできるかどうかを確認します (アクセスすべきではありません)。

試験方法

context "If anonymous user tries to GET index of fav_blogs" do
  setup do
    get :index, :end_user_id => end_users(:end_user_one).id, :format => "xml"
  end
  should_respond_with 401
  should_not_assign_to :blog_items
end

コントローラーの方法:

def index

  if params[:end_user_id] # if it is nested
    authenticate_end_user!
    authorize! :read, @end_user

    @blog_items = @end_user.blog_items
  else
    @PAGE_SIZE = 10
    page = Integer(params[:page]) || 0

    offset = @PAGE_SIZE * page
    @blog_items = BlogItem.limit( offset + @PAGE_SIZE ).offset( offset ).order('updated_at DESC').all
  end

  respond_with(@blog_items)
end

認証されたユーザーを使用したすべてのテストは正常に機能します-誰かが私にヒントを与えることができます. どうもありがとう!ベン

4

1 に答える 1

0

完了しました - 問題が発生している理由は次のとおりです

authenticate_end_user!
authorize! :read, @end_user

ブロック。最初の行は、承認がない場合に 401 エラーをレンダリングしますが、いずれにせよ、2 行目は実行されます。したがって、認証を before_filter に入れ、承認を別のものまたはコントローラー アクションに入れます。ベン

于 2010-06-22T09:08:10.443 に答える