12
4

【minitest】 request.refererを使用する方法

Last updated at Posted at 2023-11-24

はじめに

最近request.refererという便利なものがあることを知り、使用する機会がありました。
ですが、minitestを書いている際にリファラを用いたアクションのテストがうまくいかず少し苦戦してしまったため、備忘録を兼ねてここに残しておこうと思います。

そもそもrequest.refererってなに?

リクエストヘッダーが持っている情報の一つであり、遷移前のURLを取得することができます。

そのため、request.refererを活用することで、

  • どのページからの流入なのかアクセス解析ができる
  • 遷移元のURLに戻りたい時にリダイレクト先として使用できる

といったメリットがあります。

今回は後者のように、request.refererをリダイレクト先として使用した時の、minitestの書き方について考えます。

minitestでのrequest.referer

ここではrequest.refererを使用して、遷移元のURLに再度リダイレクトするようなアクションのテストを作成することを考えます。

# get new_pathを叩いた時のアクション
# original_pathからnew_pathに遷移してきたケースを考える
def hoge
    redirect_to request.referer # 遷移元のoriginal_pathにリダイレクト
end

上記アクションによってoriginal_pathに遷移していることを確認したいとき、どのようにテストを記述すれば良いのでしょうか。

失敗するやり方

遷移元のURLを再現するためにoriginal_pathを叩いてからnew_pathを叩けばいいのでは?と思い下記の方法を試してみましたが、うまくいきませんでした。

test 'request.refererを使用したアクションのテスト' do
    get original_path
    get new_path
    assert_redirected_to original_path
end

# 実行結果
# => Minitest::Assertion: Expected response to be a <3XX: redirect>, but was a <500: Internal Server Error>

エラーの発生箇所を調査してみると、コントローラー側で下記のようなメッセージが出ておりrequest.refererがnilであることがわかります。
つまり、リクエストヘッダーにリファラをセットできていない状態です。

# Rendering with exception: Cannot redirect to nil!

ではminitestでリファラをセットするにはどうすればいいのでしょうか。

成功するやり方

test 'request.refererを使用したアクションのテスト' do
    get new_path,
        headers: {'HTTP_REFERER' => original_path}
    assert_redirected_to original_path
end

上記のように、リクエストヘッダーにリファラを明示的にセットしてあげることで、リファラを用いたアクションのテストを記述することができるようになりました。

まとめ

  • request.refererを用いることで、遷移元のURL情報を取得することができる。
  • minitestで再現する場合、リクエストヘッダーにリファラを持たせることを明記する必要がある。

ちなみに

request.refererと書くことが多いですが、正しい英単語はreferrerだそうです。
エイリアス設定されているおかげで、refererもreferrerも同じ動作をします。

参考

12
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
4