🔢

【rspec】桁数が少ないフィールドにシーケンスを使用する危険

2023/11/20に公開

表題について

シーケンスを使用すると、テスト全体で一貫した連番の値が生成されますが、その値はインクリメントされ続けます。したがって、テストが多く実行されると、桁数が小さいフィールドの値が上限を超えてしまう可能性があります。例えば、2桁のフィールドでシーケンスを使用している場合、99までの値が生成されますが、100を超える値を生成しようとすると、桁あふれが発生し、意図しない挙動やデータベースの制約違反が発生する可能性があります。

そのため、桁数が少ないフィールドでは、シーケンスの代わりに値を循環させる方法を使用することが推奨されます。循環させることで、値が一定の範囲内でループし、制約違反を回避することができます。

例えば...

1桁のフィールドで循環させる場合、以下のようなコードが考えられます:

FactoryBot.define do
  factory :example do
    sequence(:code) do |n|
      digits = 1
      max_value = 9
      format("%0#{digits}d", (n % max_value) + 1)
    end
  end
end

上記の例では、digitsを桁数、max_valueを最大値として設定しています。n % max_valueを計算することで、値を循環させています。formatメソッドを使用して、指定した桁数で値をフォーマットしています。

このように循環させることで、テスト全体を通して安全に制約に適合する値を生成することができます。

Discussion