web-dev-qa-db-ja.com

Rspec-Rails-リダイレクトに従う方法

誰もが(コントローラ仕様で)rspecにリダイレクトに従う方法を知っていますか? (例:test/unit has follow_redirect!)

「follow_redirect!」を試してみましたおよび「follow_redirect」ですが、

undefined method `follow_redirect!' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_1:0xb6df5294>

例えば:
アカウントを作成すると、ページがアカウントページにリダイレクトされ、新しいアカウントがリストの一番上に表示されます。

it "should create an account" do
  post :create, :name => "My New Account"
  FOLLOW_REDIRECT!
  response.code.should == "200"
  accounts = assigns[:accounts]
  accounts[0].name.should == "My New Account"
end

しかし、FOLLOW_REDIRECT!実際に機能するものに変更する必要があります。

40

リダイレクトをテストする場合は、rspec-Railsドメインの外に移動しています。

これをテストするには、Webratまたは他の統合テストフレームワークを使用できます。

統合テストに頼らずにこれを解決する最も簡単な方法は、リダイレクトを引き起こしているメソッドを模擬することです。

19
andersjanmyr

これは rspec-Rails コントローラテストのデフォルトの動作だと思います。つまり、応答ステータスやパスに期待値を設定し、成功するかどうかをテストできます。

例えば:

it "should create an account" do
  post :create
  response.code.should == "302"
  response.should redirect_to(accounts_path)
end
65
zetetic

リダイレクト場所にアクセスできます

response.headers['Location']

その後、それを直接要求できます。

27
toonsend

Test :: Unitの統合テストに相当するリダイレクト使用リクエストの仕様にしたい場合は、仕様が範囲外です。

要求仕様では、follow_redirect!はTest :: Unitと同様に機能します。

または、すぐにリダイレクトする場合は、動詞のサフィックスとして_via_redirectを使用します。例:

post_via_redirect :create, user: @user

統合/リクエストテストを使用してみます。彼らはコントローラーへのルーティングを通じてウェブのようなアクセスを使用しています。例:Rails 2 app in file /spec/integration/fps_spec.rb

 require 'spec_helper'

 describe "FinPoradci" do 

   it "POST /fps.html with params" do
     fp_params={:accord_id => "FP99998", :under_acc => "OM001", :first_name => "Pavel", :last_name => "Novy"}
     fp_test=FinPoradce.new(fp_params)
     #after create follow redirection to show
     post_via_redirect "/fps", {:fp => fp_params}
     response.response_code.should == 200 # => :found ,  not 302 :created
     new_fp=assigns(:fp)
     new_fp.should_not be_empty
     new_fp.errors.should be_empty
     flash[:error].should be_empty
     flash[:notice].should_not be_empty
     response.should render_template(:show)
   end
 end

そしてそれは動作します。ヘッダーを送信するまで(基本的なhttp認証用)。

 env={'HTTP_AUTHORIZATION' => ActionController::HttpAuthentication::Basic.encode_credentials(user,password)}
 post_via_redirect "/fps", {:fp => fp_params}, env

作成には問題ありませんが、リダイレクト後は401が返され、新しい認証が必要です。 SO 2つのテストに分割する必要があります:作成と作成の結果を表示します。

2
Foton

RSpec/Capybara + Railsの場合

response_headers['Location']

ただし、リダイレクトの前に遅延がない場合にのみ機能します。そこにあると、ロジックに従うのが難しくなります。