👻
FactoryBot(旧FactoryGirl) のバージョンを上げたらundefined methodになった問題
問題
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
Discussion