カピバラを使用してクエリ文字列で現在のパスを取得する方法


144

ページのURLは、カピバラのメソッド/people?search=name を使用している間だけcurrent_path返さ/peopleれました。

current_path.should == people_path(:search => 'name')

しかし、それは言って失敗します

expected: "/people?search=name"
got: "/people"

どうすれば合格できますか?これを行う方法はありますか?


10
"/people?search=name" はパスではありません"/people"パスです
Andrei Botalov 2013年

回答:


212

カピバラでの現代の慣習を反映するために、この回答を更新しました。これは受け入れられる回答であり、多くの人が解決策を探すときに参照されているので、これは理想的だと思います。そうは言っても、現在のパスをチェックする正しい方法はhas_current_path?、ここに記載されているように、カピバラが提供するマッチャーを使用することです:ここをクリック

使用例:

expect(page).to have_current_path(people_path(search: 'name'))

ドキュメントで確認できるように、他のオプションを使用できます。現在のページがparamに関係なくページ/people?search=name上にあることにのみ/people関心がある場合は、only_pathオプションを送信できます。

expect(page).to have_current_path(people_path, only_path: true)

さらに、URL全体を比較する場合:

expect(page).to have_current_path(people_url, url: true)

この方法を指摘したTom Walpole氏の功績です。


4
おそらくすぐにこの構文が必要になるでしょう。レガシーアプリケーションのテストを書いています。使用current_path.should ==は今のところ機能しています(ただし、末尾にスラッシュを文字列として追加する必要があります)。必要になる可能性が高いコードを事前に感謝します。
Tass

3
URI.parse(current_url).request_uriより簡潔です。@Lasse Bunkの回答を参照してください。
リチャードジョーンズ

Capybara 2.5以降、これはもはや最良の答えではありません。以下の@ tom-walpoleの回答を参照してください。
dkniffin

質問者が受け入れた回答を変更する可能性は低いので、現代を反映するように回答を更新しました。これは、解決策を探して最初の答えを見つけた新しいユーザーにとってより役立つはずです。指摘してくれた@OddityOverseerに感謝
nzifnab

1
新しいカピバラバージョンのignore_query: true代わりに使用してくださいonly_path: true
アレクサンダー

92

_pathメソッドを_urlに置き換えて、完全なURLとパラメーターを比較できるようにしました。

current_url.should == people_url(:search => 'name')

4
ホスト部分をどのように扱いましたか?
Chris Nicola、

11
current_path新しいバージョンのカピバラで使用して照合することもできますpeople_path(...)
Jason Stirk

名前付きパスがない場合... / users / registerしかありません...では、それをどのように使用する必要がありますか?
Gopal S Rathore 2013年

レンダリングで発生していて、URLがHTMLページと異なる場合はどうなりますか?
bigpotato 14

52

現代のためにこの質問を更新するだけです。Capybara 2.5+を使用しているときにcurrent_pathsをチェックするための現在のベストプラクティスは、current_pathマッチャーを使用することです。これは、Capybarasの待機動作を使用してパスをチェックします。request_uri(パスとクエリ文字列)をチェックしたい場合

expect(page).to have_current_path(people_path(:search => 'name'))  

パス部分のみが必要な場合(クエリ文字列は無視)

expect(page).to have_current_path(people_path, only_path: true) # Capybara < 2.16
expect(page).to have_current_path(people_path, ignore_query: true) # Capybara >= 2.16

完全なURLに一致させたい場合

expect(page).to have_current_path(people_url, url: true) # Capybara < 2.16
expect(page).to have_current_path(people_url) # Capybara >= 2.16

マッチャーは、==と比較される文字列、または照合する正規表現を取ります

expect(page).to have_current_path(/search=name/)

4
これらの現代では、これはとしてマークされなければならない答え。これにより、あいまいなタイミングの問題の多くが保護されます。
Ax

1
@Vanuan rspecはshould構文を廃止しています。expect().to今後は、仕様で使用するように努力する必要があります。
nzifnab

1
only_path: trueisignore_query: true
srghma

18

回答が選択されたのはわかっていますが、代わりの解決策を提示したかっただけです。そう:

request.fullpathRailsのようにパスとクエリ文字列を取得するには、次のようにします。

URI.parse(current_url).request_uri.should == people_path(:search => 'name')

次のように、テストクラス(のようなActionDispatch::IntegrationTest)でヘルパーメソッドを実行することもできます(これは私がしたことです):

def current_fullpath
  URI.parse(current_url).request_uri
end

お役に立てれば。


1

編集:Tinynumberesが言及したように、これはポート番号のあるURLでは失敗します。他の誰かが同じ素晴らしいアイデアを持っている場合に備えて、ここに保管してください。

current_url[current_host.size..-1]

同様にゴルフ(35文字) URI.parse(current_url).request_uriですが、明示的なURI解析が含まれないため、潜在的に高速です。

これをカピバラに追加するプルリクエストを作成しました:https : //github.com/jnicklas/capybara/pull/1405


current_urlポート番号が含まれている場合、これは機能しません。たとえば、a current_urlを指定するとhttp://foo.com:8888/some/pathcurrent_url[current_host.size..-1]は等しくなり:8888/some/pathます。また、裏側では、@ nzifnabが受け入れられた回答で推奨current_hostしたのと同じ種類のURI.parseロジックを実行します。
Tinynumbers、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.