誰もが(コントローラ仕様で)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!実際に機能するものに変更する必要があります。
リダイレクトをテストする場合は、rspec-Railsドメインの外に移動しています。
これをテストするには、Webratまたは他の統合テストフレームワークを使用できます。
統合テストに頼らずにこれを解決する最も簡単な方法は、リダイレクトを引き起こしているメソッドを模擬することです。
これは rspec-Rails コントローラテストのデフォルトの動作だと思います。つまり、応答ステータスやパスに期待値を設定し、成功するかどうかをテストできます。
例えば:
it "should create an account" do
post :create
response.code.should == "302"
response.should redirect_to(accounts_path)
end
リダイレクト場所にアクセスできます
response.headers['Location']
その後、それを直接要求できます。
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つのテストに分割する必要があります:作成と作成の結果を表示します。
RSpec/Capybara + Railsの場合
response_headers['Location']
ただし、リダイレクトの前に遅延がない場合にのみ機能します。そこにあると、ロジックに従うのが難しくなります。