Rspec - Rails - リダイレクトをたどる方法
-
30-09-2019 - |
質問
rspecを(コントローラー仕様で)リダイレクトに従うようにする方法を知っている人はいますか?(例: test/unit には 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']
その後、それを直接要求できます。
統合/リクエストテストを使用してみてください。彼らは、コントローラーへのルーティングを通じてWebのようなアクセツを使用しています。例:ファイルにRails 2アプリを用意しています /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
Createには問題ありませんが、リダイレクトの後、401を返し、新しい承認が必要です。したがって、2つのテストで分割する必要があります。作成と作成の結果についての表示です。
仕様は範囲外です。リダイレクト使用要求仕様に従う場合は、テスト::ユニットの統合テストに相当します。
リクエスト仕様 follow_redirect!
テスト::ユニットでも機能します。
または、メディアリーで使用することをリダイレクトする場合 _via_redirect
動詞の接尾辞として、例:
post_via_redirect :create, user: @user
rspec / capybara +レール用
response_headers['Location']
ただし、リダイレクトの前に遅延がない場合にのみ機能します。そこにある場合、ロジックに従うことは困難です。