前提
- 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」に遭遇したような...?
よくあることなのかな
