[Ruby on Rails 4] Factory Girl から Factory Bot へ移行する
遅ればせながらイントラツールの移行をしました memo.
公式と @jnchito さんの記事を参考にして進めました。
Contents
Gemfileを更新してbundle install
GemFile を更新します。
group :development, :test do
gem 'factory_bot_rails'
bundle install
を実行します。
プロジェクト内の FactoryGirl を FactoryBot に置換
grep と sed で一括置換します。
が、argument list too long: grep
とエラー。
% grep -e FactoryGirl **/*.rake **/*.rb -s -l | xargs sed -i "" "s|FactoryGirl|FactoryBot|g"
zsh: argument list too long: grep
公式サイトの “various other approaches” を確認してコマンドを少し修正しました。
% grep -rl -e FactoryGirl --include=\*.{rb,rake} . | xargs sed -i "" "s|FactoryGirl|FactoryBot|g"
プロジェクト内の factory_girl を factory_bot に置換
Opps!
% grep -e factory_girl **/*.rake **/*.rb -s -l | xargs sed -i "" "s|factory_girl|factory_bot|g"
zsh: argument list too long: grep
書き換えて実行します。
% grep -rl -e factory_girl --include=\*.{rb,rake} . | xargs sed -i "" "s|factory_girl|factory_bot|g"
テストがすべてパスすることを確認
テストを実行。
% bin/rake spec
:
An error occurred while loading ./spec/routing/foo_spec.rb.
Failure/Error: weight 2
NoMethodError:
undefined method 'weight' in 'delivery_charge' factory
Did you mean? 'weight { 2 }'
:
0 examples, 0 failures, 21 errors occurred outside of examples
エラーが発生したので修正。
spec/factories/*.rb
内のファイルを指示通り { }
付きに修正。
いろいろあって触れていなかったけれども、地道にアップグレードしていく。
補遺
実行したコマンドのオプションについて。
% grep -rl -e FactoryGirl --include=\*.{rb,rake} . | xargs sed -i "" "s|FactoryGirl|FactoryBot|g"
grep
-r –recursive ディレクトリを指定した場合はサブディレクトリ内のファイルも含めて検索する(–directories=recurse相当)
sed
最後のスラッシュの後に付加されている ‘g’ オプションが一括置換を指示しています。