factory_botとは
簡単にダミーのインスタンスを作成することができるGemです。他のファイルで予め各クラスのインスタンスに定めるプロパティを設定しておき、specファイルからメソッドを利用してその通りのインスタンスを作成します。
導入方法
Gemfileに以下のように記載
group :development, :test do
#省略
gem 'factory_bot_rails'
end
bundle installします。
specディレクトリ内に’factories’というディレクトリを作成し、(今回はuserのテストをするので)users.rbというファイルを作成します。
factory_bot を使ってuserを定義する
先ほど作成したfactories/users.rb
内にダミーのuserを定義します。
FactoryBot.define do
factory :user do
name {"tanu"}
email {"test@email.com"}
password {"11111111"}
password_confirmation {"11111111"}
end
end
定義したuserをテスト内で使う
先に定義したuserは下記のように使用します。
describe User do
describe '#create' do
it 'is invalid without a name' do
user = FactoryBot.build(:user, name: nil)
user.valid?
expect(user.errors[:name]).to include("を入力してください")
end
end
end
これは、下記の内容と一緒です。(下記は、factory_botを使用しないで、同じ内容を記述した例)
describe User do
describe '#create' do
it 'is invalid without a name' do
user = User.new(name: "", email: "test@email.com", password: "11111111", password_confirmation: "11111111")
user.valid?
expect(user.errors[:name]).to include("を入力してください")
end
end
end
なお、
user = FactoryBot.build(:user, name: nil)
の FactoryBot
は省略可能で、上記は、
user = build(:user, name: nil)
と書くこともできます。
buildメソッドとcreateメソッド
factory_botのメソッドのうち
-
build
... インスタンスを生成するメソッド。newと同じ -
create
... データのsaveまでを行う。ただし、saveされたデータは、1回のテストが終わったら消えてしまう。
という特徴がそれぞれあるそうです。
レシーバーの"FactoryBot"という記述を省略する
さらに、rails_helperに下記のような記述をしておくことで、"FactoryBot"という記述は省略できるそうです。
RSpec.configure do |config|
#下記の記述を追加
config.include FactoryBot::Syntax::Methods
#省略
end
上記の記述によって、テストの記述は下記のように省略できます。
user = build(:user, name: nil)
テストはしっかり学習しておくように周りから色々なアドバイスを受けるのですが、なかなか奥が深いですね。また折を見て復習したいです。