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 は「仕様の不変条件」を表現する道具。「コードの重複削減」の道具ではありません。