質問

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']

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top