👻

FactoryBot(旧FactoryGirl) のバージョンを上げたらundefined methodになった問題

2021/01/07に公開

問題

FactoryBot(旧FactoryGirlライブラリ名が変更になった)のバージョンを5.0.0に上げるとエラーで動かなくなった。

FactoryBot5系がリリースされて久しいですが、現実は辛く厳しく、人には色々事情があるもの。

FactoryBot4系からFactoryBot5系にようやく移行する人向けの記事です。

エラーメッセージ

/path/to/product/vendor/bundle/ruby/2.5.0/gems/factory_bot-5.0.0/lib/factory_bot/definition_proxy.rb:97:in `method_missing': undefined method 'title' in 'theme' factory (NoMethodError)

解決方法

before

FactoryBot.define do
  factory :theme do
    user {nil}
    title Faker::Pokemon.name # この書き方では5系では動かない
    status {:published}
  end
end

after

FactoryBot.define do
  factory :theme do
    user {nil}
    title {Faker::Pokemon.name}
    status {:published}
  end
end

属性名とそれに対応するデフォルト値を、今までは(beforeの書き方のように)スペース区切りでも定義できていましたが、5.0.0からは中括弧{}でくくらないと動かなくなる模様。

ちなみにFactoryBot4系ではDeprecation Warningが出るはずなので、5.0へのアップデートを行う前に早めに対応しておきましょう。

一括で直す方法

rubocop-rspecがある前提ならば、以下のコマンドで一括でFactoryの記述を修正することができます。

rubocop --require rubocop-rspec --only FactoryBot/AttributeDefinedStatically --auto-correct

参考

Deprecating static attributes in factory_bot 4.11

Discussion