質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

【RSpec】クエリ文字列をエンコードしてテストしたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 191

pecchan

score 335

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などが
エンコードするメソッドだと分かり、以下のようにしました。

検索画面

<form action="/items" accept-charset="UTF-8" method="get" class="navbar-form navbar-left">
        <div class="input-group">
          <input type="text" name="search[keyword]", class="form-control " placeholder="何かお探しですか?">
          <div class="input-group-btn">
            <button class="btn btn-default" type="submit" id="search_button">
              <i class="glyphicon glyphicon-search"></i>
            </button>
          </div>
        </div>
      </form>

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]をくっつける部分が何だかなぁ・・・て感じです。
メソッドの使い方を間違ってるでしょうか??

このようなテストをしたい場合、通常どうするものでしょうか?

諸先輩方アドバイス宜しくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

すると生成されるURIは、以下のようになり
先頭から26文字目の1字が異なるだけで後は一緒のようです。

=をエンコードしてしまうのは正しくありません。比較対象となる文字列の作り方が不適当、ということになります。


今回はパラメーターが1つですが、一般にURLパラメーターが複数ある場合、順序は考慮しませんので、文字列一致で正しいかどうかを判定することは不適当になります。逆に、HTMLへ出力されたURLをパースして、目的のパラメータが生成するか確認する、という流れのほうが妥当かと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/02 11:19

    いつも有難う御座います。
    使い方も悪かったですが、そもそも複数パラメータの際は、順序の問題があるのですね。
    教えていただいた方法で確認することにします。
    有難う御座いました!

    キャンセル

  • 2020/07/03 17:25

    「解決」になってませんでした、遅くなりましたが解決済みにさせていただきました。有難う御座います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る