38

RSpec と Cabybara がいかにクールかを学んだばかりで、実際のテストを書くことを学ぶためにそれに取り組んでいます。

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

1) ページ /projects/list があります
        - HTML「戻る」のアンカーがあり、/projects/show にリンクしています

以下は私がrspecで書いたテストです

「サンプル」を記述する
  「GET /projects/list」と記述する
    それを「サンプルテスト」します
      「/projects/list」にアクセスしてください
      click_link "戻る"
      assert_redirected_to "/projects/show"
    終わり
  終わり
終わり

テストは、以下のような失敗メッセージで失敗します

    失敗/エラー: assert_redirected_to "/projects/show"
     引数エラー:
       @request は ActionDispatch::Request でなければなりません

リダイレクトをテストする方法と、何が間違っているのか教えてください。

4

4 に答える 4

80

試すcurrent_path.should == "/projects/show"

Capybaracurrent_urlは、完全修飾 URL のメソッドも実装しています。

詳しくはドキュメントをご覧ください。

編集

Capybara には have_current_path と呼ばれる RSpec マッチャーがあり、次のように使用できます: expect(page).to have_current_path(some_other_page_path)(thanks @bjliu)

于 2012-06-29T03:12:49.927 に答える
11

これがあなたが必要とするものであるかどうかはわかりませんが、私のテストではそのようなアプローチを好みます:

...
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
于 2014-06-22T15:41:03.383 に答える
5

Devise wikiから:

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

また、このページには同じ情報があります: Rspec は正しいパスにたどり着いたことを確認します

そのため、その URL にリダイレクトされているかどうかをテストするのではなく、現在その URL にアクセスしていることをテストする必要があります。

于 2012-06-27T14:04:48.833 に答える
-3

次のようなルートを使用する必要があります。

assert_redirected_to projects_path

それよりも

assert_redirected_to "/projects/show"
于 2012-06-27T11:25:26.217 に答える