回答:
カピバラでの現代の慣習を反映するために、この回答を更新しました。これは受け入れられる回答であり、多くの人が解決策を探すときに参照されているので、これは理想的だと思います。そうは言っても、現在のパスをチェックする正しい方法は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氏の功績です。
current_path.should ==
は今のところ機能しています(ただし、末尾にスラッシュを文字列として追加する必要があります)。必要になる可能性が高いコードを事前に感謝します。
URI.parse(current_url).request_uri
より簡潔です。@Lasse Bunkの回答を参照してください。
ignore_query: true
代わりに使用してくださいonly_path: true
_pathメソッドを_urlに置き換えて、完全なURLとパラメーターを比較できるようにしました。
current_url.should == people_url(:search => 'name')
current_path
新しいバージョンのカピバラで使用して照合することもできますpeople_path(...)
現代のためにこの質問を更新するだけです。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/)
should
構文を廃止しています。expect().to
今後は、仕様で使用するように努力する必要があります。
only_path: true
isignore_query: true
回答が選択されたのはわかっていますが、代わりの解決策を提示したかっただけです。そう:
request.fullpath
Railsのようにパスとクエリ文字列を取得するには、次のようにします。
URI.parse(current_url).request_uri.should == people_path(:search => 'name')
次のように、テストクラス(のようなActionDispatch::IntegrationTest
)でヘルパーメソッドを実行することもできます(これは私がしたことです):
def current_fullpath
URI.parse(current_url).request_uri
end
お役に立てれば。
編集: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/path
、current_url[current_host.size..-1]
は等しくなり:8888/some/path
ます。また、裏側では、@ nzifnabが受け入れられた回答で推奨current_host
したのと同じ種類のURI.parse
ロジックを実行します。
"/people?search=name"
はパスではありません。"/people"
パスです