with_request_urlテストヘルパーにprotocolパラメータを追加

viewcomponent/view_component

ViewComponentのwith_request_urlテストヘルパーにprotocol:パラメータが追加され、HTTPSプロトコルを使用するコンポーネントのテストが容易になります。これにより、環境変数を直接操作することなく、宣言的にプロトコルを指定できるようになります。

背景

Railsの*_urlヘルパー(products_urlなど)をコンポーネント内で使用する場合、デフォルトではHTTPプロトコルでURLが生成されます。HTTPSプロトコルでのURL生成をテストするには、vc_test_controller.request.env['HTTPS'] = 'on'のようにRackの環境変数を直接設定する必要がありました。#2446がこの課題を提起し、#2550がより宣言的なテストインターフェースを提供しています。

with_request_urlヘルパーは既にhost:method:パラメータをサポートしていましたが、プロトコルの指定には対応していませんでした。プロトコルは多くのアプリケーションで重要な関心事であり、APIエンドポイントや外部サービスとの連携では明示的なHTTPS URLの生成が求められます。

技術的な変更

lib/view_component/test_helpers.rbwith_request_urlメソッドprotocol:キーワード引数が追加されました。

変更前:

def with_request_url(full_path, host: nil, method: nil)
  old_request_host = vc_test_request.host
  old_request_method = vc_test_request.request_method
  # ...

  vc_test_request.host = host if host
  vc_test_request.request_method = method if method
  # ...
ensure
  vc_test_request.host = old_request_host
  vc_test_request.request_method = old_request_method
  # ...
end

変更後:

def with_request_url(full_path, host: nil, method: nil, protocol: nil)
  old_request_host = vc_test_request.host
  old_request_method = vc_test_request.request_method
  old_request_scheme = vc_test_request.scheme
  # ...

  vc_test_request.host = host if host
  vc_test_request.request_method = method if method
  vc_test_request.set_header(Rack::RACK_URL_SCHEME, protocol.to_s) if protocol
  # ...
ensure
  vc_test_request.host = old_request_host
  vc_test_request.request_method = old_request_method
  vc_test_request.set_header(Rack::RACK_URL_SCHEME, old_request_scheme)
  # ...
end

プロトコルの設定にはRack::RACK_URL_SCHEMEヘッダーが使用されています。このヘッダーはRackの標準的なプロトコル指定方法であり、request.schemerequest.ssl?の両方に影響します。protocol:には:httpまたは:httpsのシンボルを渡すことができ、to_sで文字列に変換されてからヘッダーに設定されます。

状態管理も既存パターンに従って実装されており、old_request_schemeで元のスキームを保存し、ensureブロックで確実に復元しています。protocol:nilの場合は何も設定されないため、既存のテストコードとの後方互換性が保たれています。

テストの拡充

実装の検証のため、3つの観点でテストケースが追加されました。

プロトコル設定の検証:

test/sandbox/test/test_helper_test.rbに、HTTPとHTTPSの両プロトコルが正しく設定されることを確認するテストが追加されています。ProtocolComponentrequest.schemerequest.ssl?の値を出力するテスト用コンポーネントです。

def test_with_request_url_specifying_https_protocol
  with_request_url "/products", protocol: :https do
    render_inline(ProtocolComponent.new)
  end

  assert_selector(".protocol", text: "Protocol: https, SSL: true")
end

状態復元の検証:

with_request_urlブロックの実行後、元のプロトコル設定が確実に復元されることを確認するテストも追加されています。これは複数のテストケースが連続実行される際の状態の分離を保証します。

URL生成の検証:

test/sandbox/test/rendering_test.rbでは、protocol:パラメータが実際のURL生成に反映されることを確認するテストが追加されました。UrlForComponentはRailsのURLヘルパーを使用してURLを生成するコンポーネントです。

def test_with_request_url_with_https_protocol
  with_request_url "/", protocol: :https do
    render_inline UrlForComponent.new(only_path: false)
    assert_text "https://test.host/?key=value"
  end

  with_request_url "/products", protocol: :https, host: "secure.example.com" do
    render_inline UrlForComponent.new(only_path: false)
    assert_text "https://secure.example.com/products?key=value"
  end
end

設計判断

シンボルによるプロトコル指定が採用されました。protocol:には:http:httpsのシンボルを渡すインターフェースになっており、これはRailsのルーティング設定などで広く使われているパターンです。PR説明文では「Follows existing patterns for host: and method: parameters. The protocol parameter accepts symbols (:http or :https) for a cleaner API.」と述べられています。

既存の状態管理パターンの踏襲も重要な判断です。host:method:パラメータと同じく、protocol:も「保存→設定→復元」のパターンで実装されています。ensureブロックでの復元により、テスト実行中に例外が発生した場合でも状態の汚染を防ぎます。

まとめ

本PRは、ViewComponentのテストヘルパーにプロトコル指定機能を追加した変更です。環境変数の直接操作から宣言的なパラメータ指定へと移行することで、HTTPSを使用するコンポーネントのテストコードがより読みやすく保守しやすくなります。既存のhost:method:パラメータと同じパターンを踏襲することで、APIの一貫性も保たれています。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
3回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)→セクション群(各論)→まとめ(結論)の構成が明確で、ガイドラインに完全に準拠しています。背景、技術詳細、設計判断がそれぞれ独立したセクションとして設けられており、非常に理解しやすい構成です。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(```ruby:path/to/file.rb)およびGitHubのPR・Issueへのリンク記法([#123](URL))が、すべて正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

ViewComponentやRailsのテストヘルパーに関する知識を前提としており、専門知識を持つエンジニアという対象読者に完全に適合しています。過度な説明がなく、簡潔で的確です。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論→各論の構成になっており、各段落もトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が守られています。可読性が非常に高いです。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されているコードブロックは、提供されたDiff情報と完全に一致しています。変更点やテストコードの引用が正確で、技術的な変更内容を正しく反映しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`Rack::RACK_URL_SCHEME`や`request.scheme`といった技術用語が正確に使用されており、PRの文脈とも一致しています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

「`Rack::RACK_URL_SCHEME`ヘッダーが`request.scheme`と`request.ssl?`の両方に影響する」という説明など、技術的な解説が正確かつ論理的です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張(例:従来のテスト方法、シンボルによるAPI設計、状態管理パターン)は、PRのDescriptionやDiff内のコードで裏付けられており、ハルシネーションは検出されませんでした。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#2550)やIssue番号(#2446)などの固有名詞はすべて正確に記載されています。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトル「with_request_urlテストヘルパーにprotocolパラメータを追加」は、PRのタイトルと内容を正確に反映しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

PR情報に含まれない外部知識(バージョン情報、リリース予定など)の追加はなく、提供された情報源に忠実です。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「追加され」「なります」といった時間表現は、PRの変更内容を正確に反映しており、歪曲は見られませんでした。