2012-06-27 45 views
31

RSpecとCabybaraがいかにクールであるかを学び、実際のテストを書くことを学びました。RSpecとCapybara(Rails)によるテストリダイレクト

リンクをクリックした後に特定のページへのリダイレクトがあるかどうかを確認しようとしています。以下 はテストが

 
    Failure/Error: assert_redirected_to "/projects/show" 
    ArgumentError: 
     @request must be an ActionDispatch::Request 

以下のようなエラーメッセージで失敗したシナリオ

 

1) I have a page /projects/list 
     - I have an anchor with html "Back" and it links to /projects/show 

Below is the test i wrote in rspec 

describe "Sample" do 
    describe "GET /projects/list" do 
    it "sample test" do 
     visit "/projects/list" 
     click_link "Back" 
     assert_redirected_to "/projects/show" 
    end 
    end 
end 

である私は、リダイレクトをテストする必要があり、私が間違って何をやっているどのように私を提案してください?

答えて

68

current_path.should == "/projects/show"

カピバラも完全修飾URLのcurrent_urlメソッドを実装してみてください。

さらに詳しい情報はdocsにあります。

+3

は' projects_path'を使うほうが良いでしょうか?そして、おそらく 'expect'表記を使用しているときには、 – SuckerForMayhem

-2

あなたは、ルートを使用するような何か必要があります:Devise wikiから

assert_redirected_to projects_path 

ではなく

assert_redirected_to "/projects/show" 
+0

assert_redirected_toが、それは '未定義のローカル変数やメソッド' projects_path」のような示しprojects_path' 'のように、私が使用して# ' – balanv

+0

あなたはこの場合projects_show_pathにする必要があります –

4

を:

Railsの際にラックアプリケーションリダイレクトでは(同じようにWarden/Deviseがログインページにリダイレクトします)、応答は統合セッションによって正しく更新されません。結果として、assert_redirected_toヘルパーは機能しません。

また、このページには、同じ情報を持っていますRspec make sure we ended up at correct path

だからではなく、あなたがそれにリダイレクトされているテストよりも、あなたがそのURLに今していることをテストする必要があります。

10

イムではない、これはあなたが必要なものをすることができていることを確認しますが、私のテストでは、私はこのようなアプローチを好む:

... 
subject { page } 
... 
before do 
    visit some_path_path 
    # do anything else you need to be redirected 
end 
it "should redirect to some other page" do 
    expect(page.current_path).to eq some_other_page_path 
end 
+0

' page.current_path'は不要です。すでに 'page'を主語として宣言しているので、' current_path'だけを使うことができます – mitra

関連する問題