AetherEchoesEngineering
Vol.042025年7月22日
Engineering#00102 min2395 view

RSpec の shared_examples を最小に保つ理由

shared_examples は便利。だから乱用される。「一度書いたら 5 箇所で使える」は、実は「5 箇所で読めなくなる」の言い換え。

SoSoraEndo2025年7月22日2 min239

抽象化のコストはテストでこそ高い

アプリ実装での DRY は概ね正しい。テストでの DRY は、しばしば読みやすさを下げる方向に働きます。shared_examples はその最たる例。

ルール

  • 同じテストを 3 箇所以上で書きそうになるまで shared にしない
  • shared 化する瞬間に、「これは仕様の本質か、たまたま重なっただけか」を問う
  • shared に渡す引数は 3 個以下。それ以上ならクラスや context に分離

良い shared_examples の例

RSpec.shared_examples 'authenticatable endpoint' do
  it 'rejects request without bearer token' do
    send_request
    expect(response).to have_http_status(:unauthorized)
  end
end

認証は「アプリの不変条件」なので、shared 化する価値がある。

悪い例

shared_examples 'creates a record' do |model:, attrs:, expected_status:|
  ...
end

引数 3 つ、しかも model を渡している時点で、そのテストはもう「具象を消化しすぎている」。

まとめ

shared_examples は「仕様の不変条件」を表現する道具。「コードの重複削減」の道具ではありません。

Tags

Reaction

Share

X (Twitter)