【RSpec】Factory_botについて
はじめに
Factory_Botの使用方法について説明します。(gemはインストール済とする)
初期設定
rails_helper.rb
RSpec.configure do |config| config.include FactoryBot::Syntax::Methods end
テストデータの作成方法
Userモデルがある場合、
spec/factories/配下にテストしたい該当モデルのファイルを作成する。 Userモデルならusers.rbという形でファイルを作成する。
spec/factories/users.rb
FactoryBot.define do factory :user do name { "test" } email { "example@com" } end end
このように、ファクトリを作成できます。
テストデータの使用方法
spec/models/users_spec.rb
RSpec.describe User, type: :model do let(:user){ FactoryBot.create(:user) } #通常の書き方 DB登録される let(:user){ create :user} #省略記法 let(:user){ FactoryBot.build (:user)} #通常の書き方 DB登録されない let(:user){ build :user} #省略記法 let(:user){ build :user, name: "hogehoge"} #上書きすることも可能 end
traitの使用
traitを使用することによって、factoryのデータを柔軟に変更できます。例えば、管理者、編集者、記者と分けたい場合はこのように記述します。
users.rb
FactoryBot.define do factory :user do sequence(:name) { |n| "user-#{n}" } password { 'password' } password_confirmation { 'password' } role { :writer } trait :admin do sequence(:name) { |n| "admin-#{n}" } role { :admin } end trait :editor do sequence(:name) { |n| "editor-#{n}" } role { :editor } end trait :writer do sequence(:name) { |n| "writer-#{n}" } role { :writer } end end end
呼び出すときは、このようにします。
users_spec.rb
RSpec.describe User, type: :model do let(:user){ create :user, :writer} 基本データにwriterのnameとroleを上書きする let(:user){ create :user, :admin} 基本データにadminのnameとroleを上書きする