質問: Rails 5.2.4.3 rspec-rails (4.0.1) Railsにて初めて検索画面を作ってる初心者です。 検索の実行で正しいページに遷移したどうかをテストしてます。 ページのテストは今まで ``` expect(page).to have_current_path(items_path) ``` のようにしてましたが、 今回はクエリ文字がエンコード&付与されるため、 ``` "/items?search%5Bkeyword%5D=%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3" ``` のようなページがテスト対象になります。 このような場合、どのようにするのが一般的なのでしょうか? 【試したこと】 encode_www_form、encode_www_form_componentなどが エンコードするメソッドだと分かり、以下のようにしました。 検索画面 ``` ``` encode_www_formを使ってみたパターン ``` expect(page).to have_current_path(items_path + "?" + URI.encode_www_form(["search[keyword]", "パソコン"])) ``` すると生成されるURIは、以下のようになり 先頭から26文字目の1字が異なるだけで後は一緒のようです。 惜しいけど駄目でした。。。 ``` 欲しいURI "/items?search%5Bkeyword%5D=%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3" 生成された方 "/items?search%5Bkeyword%5D&%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3" ``` encode_www_form_component使ってみたパターン ``` expect(page).to have_current_path(items_path + "?search%5Bkeyword%5D=" + URI.encode_www_form_component('パソコン')) ``` これだとマッチして通りましたが、search[keyword]をくっつける部分が何だかなぁ・・・て感じです。 メソッドの使い方を間違ってるでしょうか?? このようなテストをしたい場合、通常どうするものでしょうか? 諸先輩方アドバイス宜しくお願いします。
回答: > > すると生成されるURIは、以下のようになり > > 先頭から26文字目の1字が異なるだけで後は一緒のようです。 > > > `=`をエンコードしてしまうのは**正しくありません**。比較対象となる文字列の作り方が不適当、ということになります。 今回はパラメーターが1つですが、一般にURLパラメーターが複数ある場合、順序は考慮しませんので、文字列一致で正しいかどうかを判定することは不適当になります。逆に、HTMLへ出力されたURLを**パース**して、目的のパラメータが生成するか確認する、という流れのほうが妥当かと思います。