web-dev-qa-db-ja.com

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

ページのURLは/people?search=nameのようなものですが、capybaraのcurrent_pathメソッドを使用したときに/peopleのみが返されました。

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

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

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

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

138
kriysna

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

使用例:

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

ドキュメントで見ることができるように、他のオプションが利用可能です。現在のページが/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に感謝します。

204
nzifnab

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

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

この質問を現代のために更新するだけです。 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/)
49
Thomas Walpole

回答が選択されていることは知っていますが、代替ソリューションを提供したかっただけです。そう:

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

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

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

def current_fullpath
  URI.parse(current_url).request_uri
end

お役に立てれば。

17
Lasse Bunk

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

current_url[current_Host.size..-1]

URI.parse(current_url).request_uriとまったく同じ(35文字)ですが、明示的なURI解析が含まれていないため、潜在的に高速です。

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