Adapters テストヘルパーの不具合修正

basecamp/kamal

この PR はテストヘルパーの誤動作を解消し、Passbolt アダプターのテスト失敗を根本的に修正します。stub_ticks_with が意図した通りにスタブを適用できるようになり、テストの信頼性が向上します。

背景

stub_ticks_with が正しくチェーンされた期待値を登録できず、テストが誤ったスタブに依存していた という問題が Issue #1857 で報告されました。元の実装では stub_ticks` メソッドの全体スタブを生成し、stub_ticks_with がそれに対して .with を付与した上で別のスタブを返すため、チェーンした .returns が無視されていました。

この不具合は Passbolt アダプターのテストで顕在化し、passbolt verify コマンドのスタブが期待したリダイレクト付き呼び出しと一致せず、unexpected invocation エラーが発生していました。また、テストコード側で stub_ticks.with を使用していた点も succeed パラメータが無視される原因となっていました。

技術的な変更

テストヘルパーから余計な全体スタブ生成行を削除 しました。test/test_helper.rbstub_ticks_with メソッド内で最後に呼び出されていた Kamal::Secrets::Adapters::Base.any_instance.stubs(:)を除去し、stub_ticks` が生成したスタブだけを利用できるようにしています。

@@ -134,6 +134,5 @@ def stub_ticks
     def stub_ticks_with(command, succeed: true)
       # Sneakily run `false`/`true` after a match to set $? to 1/0
       stub_ticks.with { |c| c == command && (succeed ? `true` : `false`) }
-      Kamal::Secrets::Adapters::Base.any_instance.stubs(:`)
     end
 end

Passbolt アダプターのテストで stub_ticks.withstub_ticks_with に置換 し、コマンド引数からリダイレクト部分を除去しました。これにより、passbolt verify の呼び出しが期待通りにスタブされ、succeed パラメータが正しく適用されます。

@@ -9,7 +9,7 @@ class PassboltAdapterTest < SecretAdapterTestCase
   test "fetch" do
     stub_ticks_with("passbolt --version 2> /dev/null", succeed: true)
-    stub_ticks.with("passbolt verify 2> /dev/null", succeed: true)
+    stub_ticks_with("passbolt verify", succeed: true)

同様の置換がテストファイル全体に適用され、stub_ticks_with が一貫して使用されるようになりました。結果として、テストは期待したスタブ挙動で実行され、unexpected invocation エラーは解消されます。

設計判断

既存のヘルパーメソッド stub_ticks_with を残しつつ、内部実装だけを修正 する判断が取られました。新たなヘルパーを追加すると既存テストコードとの互換性が損なわれるリスクがあるため、最小限の変更で問題を解決する方針が採用されています。

また、リダイレクト付きコマンド文字列をテスト側で除外 した点は、実装側が passbolt verify のみを呼び出すことを前提としているため、テストが実装と正しく対応するように整合性を取った結果です。これにより、テストが実装に忠実に振る舞い、将来的なコマンド変更にも柔軟に対応できます。

まとめ

この PR はテストヘルパーの不具合を根本的に修正し、Passbolt アダプターのテストが期待通りに動作するようにしました。スタブ生成ロジックの簡素化と stub_ticks_with の統一使用により、テストの可読性と信頼性が向上し、今後のアダプター追加や変更にも安定したテスト基盤が提供されます。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
343fa6b5

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文・背景・技術的変更・設計判断・まとめの5要素が揃っており、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ⚠ WARNING

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

コードブロックは正しいdiff形式ですが、Issue #1857 がリンク化されていません。PRリンクは正しく記載されています。

対象読者への適合性 ✓ PASS

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

エンジニア向けの専門的な記述で、初心者向けの余計な解説はありません。

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

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

各セクションが総論・各論・結論の段落構成になり、1段落は1トピックでトピックセンテンスで始まっています。段落長も適切です。

Diff内容との照合 ✓ PASS

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

記事中のdiff抜粋は提供されたDiffと一致しており、削除・追加行は正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

stub_ticks、stub_ticks_with、any_instance などの用語はPRと合致し、誤用はありません。

説明の技術的正確性 ✓ PASS

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

変更理由・影響・期待される結果がPR内容と整合しており、技術的に正確です。

事実の突合 ✓ PASS

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

全ての主張はPRタイトル、説明、Diffで裏付けられており、推測や捏造はありません。

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

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

PR番号 #1858 と Issue番号 #1857 が正しく記載されています。数値の誤りはありません。

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

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

記事タイトルはPRタイトル「Fix adapters test helper issue」を日本語で適切に表現しています。

外部知識の正確性 ✓ PASS

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

バージョンサポートやリリース情報等、PRに無い外部知識は含まれていません。

時間表現の正確性 ✓ PASS

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

時間表現はなく、PRの記述と食い違いはありません。