2016-11-30 9 views
1

コントローラアクションをテストするrspecテストがあります。コントローラのリダイレクトをRSpecでテストする

class SalesController < ApplicationController 
    def create 
    # This redirect sends the user to SalesController#go_to_home 
    redirect_to '/go_to_home' 
    end 

    def go_to_home 
    redirect_to '/' 
    end 
end 

マイコントローラーのテストは、私は、テストを実行すると

RSpec.describe SalesController, type: :controller do 
    include PathsHelper 

    describe 'POST create' do 
    post :create 

    expect(response).to redirect_to '/' 
    end 
end 

はしかし、それは私にそれを伝えるようになっています

Expected response to be a redirect to <http://test.host/> but was a redirect to <http://test.host/go_to_home>. 
    Expected "http://test.host/" to be === "http://test.host/go_to_home". 

/go_to_homeがSalesController番号のgo_to_homeにユーザーを送信します。回答が最終的にURL http://test.host/のホームページにつながることをテストするにはどうすればよいですか?

答えて

1

コントローラテストは実質的に単体テストです。単一のアクションを呼び出す効果と、そのアクションの期待される動作をテストしています。

createアクションがLocation: http://localhost/go_to_home

あろう作成呼び出しの場合、これは限りある新しいURIを示すヘッダLocation302のステータスコードとバック応答を返さないと含みますコントローラのテストが行​​われます。ブラウザから作成アクションを呼び出すことをエミュレートし、最初のリダイレクトを受け取りました。

実際には、ブラウザは特定の場所に移動してからgo_to_homeアクションを実行しますが、これはコントローラテストの範囲を超えています...これは統合テストの領域です。

だから、どちらか、

  1. はあなたが「/」で終わるリダイレクトとテストに従って、最初にcreateアクションを呼び出すために、統合テストを作成します。
  2. 変更expect(response).to redirect_to '/go_to_home'
  3. 変更にコントローラーのテスト
2

スペックで「/」にリダイレクトされるのはなぜですか?

expect(response).to redirect_to '/go_to_home' 

編集:

が、これは本当です、あなたがに仕様を変更してみてくださいアクションを作成

を打った後、「/ go_to_home」にリダイレクトされようとしている貼り付けコントローラコードから 例またはコードはあなたが達成しようとしているものを共有するためのものですか? 「/ go_to_home」に行った後、rspecがリダイレクトに従うとは思えません。

作成アクションをテストしている場合は、そのアクションが実行しているため、 '/ go_to_home'にリダイレクトするテストは問題ありません。 他のアクションgo_to_homeに対して別のテストを行い、ルートへのリダイレクトを期待できます。

あなたは 'go_to_home'というアクションを別の場所から呼び出していますか?

+0

「/」に直接リダイレクトするcreateアクション私は私の質問を明確にします。 '/ go_to_home'はユーザーをSalesController#go_to_homeに送ります。 – jason328

+0

いいえ、私はSalesController#createからgo_to_homeだけを呼び出しています。理解するこの例を単純化して、多くのロジックが失われてしまった。 – jason328

関連する問題