りゅうじのRails学習のアウトプットblog

初学者による初学者の為の記事です。

RSpecでのseed_fuの使い方・db:seedとの違い

こんにちは、りゅうじです。

bundle exec rails seed_furails 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ディレクトリ以下に配置する。

 

f:id:ryujisurf55:20210416125540p:plain



テスト用の記述方法

今回は今、私がやっているカリキュラムの書き方を掲載します。

#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

まだ私はやったことはありませんが膨大なテストを実行する場合は時間短縮のために使われるのかなと思うので、私と同じ初学者の方はこういった方法もある!と頭の片隅に入れておけばいいと思います。

最後に

読んで頂いた方、ありがとうございました。

これからアウトプットのブログを更新していくのでよろしくお願い致します。