web-dev-qa-db-ja.com

Rails / Rspec-コントローラーでリダイレクトをテストする

そのため、私は現在、以前はなかった既存のコントローラーのコントローラーのテストを書いています。私がテストしたいのは、誰かが何かを編集することを許可されていない場合に、それを編集することが許可されている場合に発生するリダイレクトです。

編集中のコントローラーアクション

def edit
  if [email protected]? || admin?
    @company = @scorecard.company
    @custom_css_include = "confirmation_page"
  else
    redirect_to :back
  end
end

したがって、スコアカードがレビューされた場合、管理者のみがそのスコアを編集できます。そのコントローラーのルート。

# scorecards
resources :scorecards do
  member do
    get 'report'
  end
  resources :inaccuracy_reports, :only => [:new, :create]
end

そして最後にテスト

  require 'spec_helper'

  describe ScorecardsController do

    describe "GET edit" do
      before(:each) do
        @agency = Factory(:agency)
        @va = Factory(:va_user, :agency => @agency)
        @admin = Factory(:admin)
        @company = Factory(:company)
        @scorecard = Factory(:scorecard, :level => 1, :company => @company, :agency => @agency, :reviewed => true)
        request.env["HTTP_REFERER"] = "/scorecard"
      end

      context "as a admin" do
        before(:each) do
          controller.stub(:current_user).and_return @admin
        end

        it "allows you to edit a reviewed scorecard" do
          get 'edit', :id => @scorecard.id
          response.status.should be(200)
        end
      end

      context "as a va_user" do
        before(:each) do
        controller.stub(:current_user).and_return @va
      end

      it "does not allow you to edit a reviewed scorecard" do
        get 'edit', :id => @scorecard.id
        response.should redirect_to :back
      end
    end
  end
end

そのため、レビュー済みのスコアを編集しようとするとvaはリダイレクトされますが、管理者はリダイレクトされません。

しかし、これをrspecで実行すると、

ScorecardsController
  GET edit
    as a admin
      allows you to edit a reviewed scorecard
    as a va_user
      does not allow you to edit a reviewed scorecard (FAILED - 1)

Failures:

  1) ScorecardsController GET edit as a va_user does not allow you to edit a reviewed scorecard
     Failure/Error: response.should redirect_to :back
   Expected response to be a redirect to </scorecard> but was a redirect to <http://test.Host/>
     # ./spec/controllers/scorecards_controller_spec.rb:33:in `block (4 levels) in <top (required)>'

Finished in 0.48517 seconds
2 examples, 1 failure

request.env["HTTP_REFERER"] = "/scorecard"をどこに:backにするべき場所として設定したので、機能するかどうかはわかりません。または、 httpstatus を使用して考えられる300の応答がありますが、どこから始めればよいのかわかりません。

どんな助けも素晴らしいでしょう

編集

私はこのようにすることでテストできます

...
response.status.should be(302)

しかし、私はこれからアイデアを得ました question そして、リダイレクトされたURLを指定するので、これは強力であるように聞こえます。

誰でもこのような作業テストをしていますか?

58
TheLegend

この行に問題があります

response.should redirect_to :back

論理が正しくありません。 #editは、以前に設定した:backパス(/scorecard)にリダイレクトされることを期待する必要があります。ただし、ここで:backを設定します。 Rspecのコンテキストでは、:backは各例で空でなければなりません。

修正するには、次のように設定します

response.should redirect_to '/scorecard'
45
Billy Chan

テストを読みやすくするには、次のようにします:(rspec〜> 3.0)

expect(response).to redirect_to(action_path)
63

一致するルートなしでリダイレクトが発生したかどうかをテストするため

(リダイレクトをテストするために、ルートが長すぎるときにこれを使用しました:D)。あなたは単に次のようにすることができます:

expect(response.status).to eq(302) #redirected
1
aldrien.h