RSpecでのseed_fuの使い方・db:seedとの違い
こんにちは、りゅうじです。
bundle exec rails seed_fu
と rails db:seed
どちらも初期データを入れるために使いますが違いを勉強したのでアウトプットします。
結論
seed_fu
を使うのが、初期データの入れ方としては良い。
rails db:seed
何も考えずに使うと実行するたびに同じデータが登録されてしまう。
seed-fuは、すでに存在しているが変更したいレコードだけ更新したり、ファイル単位で実行できたり、簡単に書けるようなシンタックスシュガーがあったりと便利です。
シンタックスシュガーとは
プログラミング言語で、ある構文を別の記法で記述できるようにしたもの。 長い構文を簡略に記述できるようにしたり、複雑な構文を読み書きしやくするために用意される。
今回私が行っているカリキュラムではRSpecのテストでseed_fuを使っているので、RSpecでのseed_fuに関してのみの使い方を記載します。
RSpecでの使い方
gemで取得
#Gemfile
gem 'seed-fu'
$ bundle install --path vendor/bundle
フィクスチャファイルを用意
データをDBに入れる処理を記載するフィクスチャファイルはdb/fixturesディレクトリ以下に配置する。
テスト用の記述方法
今回は今、私がやっているカリキュラムの書き方を掲載します。
#sites.rb
Site.seed(
:id,
id: 1,
name: 'Blog',
subtitle: 'Very awesome!'
)
#users.rb
User.seed(
:id,
{ id: 1, name: 'admin', crypted_password: User.encrypt('password'), role: :admin },
{ id: 2, name: 'editor', crypted_password: User.encrypt('password'), role: :editor },
{ id: 3, name: 'writer', crypted_password: User.encrypt('password'), role: :writer },
)
こちらでテスト実行前にデータを挿入できます。
#spec_helper.rb
config.before :suite do
SeedFu.seed
end
特定のファイルだけを実行する方法もあるようです。こちら。
#spec_helper.rb
RSpec.configure do |config|
config.before :suite do
fixture_paths = "#{Rails.root}/db/fixtures/test"
SeedFu.seed(fixture_paths)
end
end
まだ私はやったことはありませんが膨大なテストを実行する場合は時間短縮のために使われるのかなと思うので、私と同じ初学者の方はこういった方法もある!と頭の片隅に入れておけばいいと思います。
最後に
読んで頂いた方、ありがとうございました。
これからアウトプットのブログを更新していくのでよろしくお願い致します。