前提
- RSpecでのテスト
- 対象のテストはModelのテストで、超端的に言うと「〇〇は文字列だったらダメ!」というもの。
-
FakerのFaker::Lorem.characters
を用いてランダムな文字列生成してテストにかけていた。
あ...ありのまま今起こったことを話すぜ!(ポルナレフ)
案件先でフロントエンドの修正をしていたら、なぜかCIでRSpec
のModel
テストが落ちた。
「文字列を許容しない」というテストで、Faker::Lorem.characters(number: 3)
を使って文字列を生成していたはずなのに、なぜかバリデーションを通過してしまっていた。
なぜこんなことが起こった?
調べてみると、Faker
が生成した文字列が「"625"
」のような数字のみの文字列だった。
どうやらActiveRecord
がinteger
型のカラムに文字列を代入する際、自動的に数値に変換するらしい。
つまり
-
Faker::Lorem.characters(number: 3)
→"625"
(たまたま数字のみ) -
ActiveRecord
の型キャスト →625
(integer) - バリデーション通過 → テスト失敗
たまたま運が悪くテストが落ちてしまったのである
解決策
一旦確実に文字列を生成させるようにFaker::Alphanumeric.alpha(number: 3)
で文字列を生成させることにした。
教訓
-
Faker::Lorem.characters
は英数字からランダム生成するため、約2% の確率で 数字のみになる。 -
ActiveRecord
は親切すぎて文字列を勝手に数値変換する
まとめ
というか以前もこういう「Flaky Test」に遭遇したような...?
よくあることなのかな