45

rspecを(コントローラー仕様で)リダイレクトに従わせる方法を知っている人はいますか?(たとえば、テスト/ユニットには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!実際に機能するものに変更する必要があります。

4

6 に答える 6

67

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

例えば:

it "should create an account" do
  post :create
  response.code.should == "302"
  response.should redirect_to(accounts_path)
end
于 2010-05-20T00:20:13.000 に答える
32

リダイレクト場所にアクセスするには、

response.headers['Location']

次に、それを直接要求できます。

于 2012-09-26T13:48:21.417 に答える
21

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

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

統合テストに頼らずにこれを解決する最も簡単な方法は、おそらくリダイレ​​クトの原因となっているメソッドをモックアウトすることです。

于 2010-05-20T13:15:29.773 に答える
4

仕様は範囲外です。リダイレクト使用要求の仕様に従う場合は、Test::Unitの統合テストに相当します。

リクエスト仕様follow_redirect!では、Test::Unitと同様に機能します。

_via_redirectまたは、動詞の接尾辞としてすぐにリダイレクトする場合は、次の例を使用します。

post_via_redirect :create, user: @user
于 2015-06-18T03:48:15.657 に答える
2

統合/リクエストテストを使用してみてください。彼らは、コントローラーへのルーティングを通じてWebのようなアクセスを使用しています。例:ファイルにRails2アプリがあります/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が返され、新しい認証が必要になります。だから私はそれを2つのテストに分割する必要があります:作成と作成の結果の表示。

于 2013-04-17T12:05:50.433 に答える
0

RSpec / Capybara+Railsの場合

response_headers['Location']

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

于 2013-02-21T11:34:37.813 に答える