そのため、私は現在、以前はなかった既存のコントローラーのコントローラーのテストを書いています。私がテストしたいのは、誰かが何かを編集することを許可されていない場合に、それを編集することが許可されている場合に発生するリダイレクトです。
編集中のコントローラーアクション
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を指定するので、これは強力であるように聞こえます。
誰でもこのような作業テストをしていますか?
この行に問題があります
response.should redirect_to :back
論理が正しくありません。 #edit
は、以前に設定した:back
パス(/scorecard
)にリダイレクトされることを期待する必要があります。ただし、ここで:back
を設定します。 Rspecのコンテキストでは、:back
は各例で空でなければなりません。
修正するには、次のように設定します
response.should redirect_to '/scorecard'
テストを読みやすくするには、次のようにします:(rspec〜> 3.0)
expect(response).to redirect_to(action_path)
一致するルートなしでリダイレクトが発生したかどうかをテストするため
(リダイレクトをテストするために、ルートが長すぎるときにこれを使用しました:D)。あなたは単に次のようにすることができます:
expect(response.status).to eq(302) #redirected