LoginSignup
3
3

More than 5 years have passed since last update.

FactoryGirlの遅延評価でハマったメモ

Last updated at Posted at 2016-09-07

都道府県ランキングみたいなものを持っているモデルのファクトリでハマったのでメモ。

以下のように都道府県ランキング属性の生成を、配列からのshiftで書いていたら、48回目の呼び出しからField 'ranking' doesn't have a default valueと落ちるようになった。

FactoryGirl.define do
  nums = (1..47).to_a.shuffle
  factory :hoge do
    ranking { nums.shift }
  end
end

FactoryGirlの属性にブロックを渡すと動的に評価される。
どうやらファクトリがロードされた時に確保されるであろうnumsをファクトリが保持していて、48回目以降は空配列からのshiftになっている模様。
sequenceの番号保持するのと同じイメージ?

ブロックを外すと、テストは落ちないけど、numsが同じ内容を返すようになった。これはまあ同じ配列からshiftしているから。

この挙動をちゃんと調べようと思ったけどコード読むパワーが無かった。
(多分このへん?→https://github.com/thoughtbot/factory_girl/blob/master/lib/factory_girl/attribute/dynamic.rb)

結果根本的な解決にはなっていないけど、uniqueは気にしないことにしてRandom.rand(1..47)にした。
uniqueな乱数入れるにはどうしたものか...

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3