takumiblog

新人エンジニアの技術ブログ

factory_bot_railsの導入と基本的な使い方

初めまして、takumiと申します!

今回はFactory_bot_railsの基本的な使い方について学習したのでそれをまとめていきます。

説明に不備がありましたらご指摘頂けると嬉しいです。

記事のゴール

・facotory_bot何のために使うのか?について理解できる。

・factory_bot_rails導入基本的な使い方について理解できる。

それでは解説していきます!

Factory_bot_railsとは?

factory_bot is a fixtures replacement with a straightforward definition syntax, support for multiple build strategies

factory_bot_rails github

和訳↓

factory_botは、単純な定義構文、複数のビルド戦略のサポートを備えたフィクスチャの代替品です。

むずかし笑

簡単に言うと、よく使用する変数や情報を簡単に管理できるようにしてくれるgemになります。

使い方を見ることでfactory_botの理解をより深めれると思うので、実際の使い方の解説に入っていきます。

※現時点では便利にしてくれる機能なんだなくらいの認識でokかと思います。

ちなみにrailsの統合機能をfactory_botに持たせたのが、factory_bot_railsになりますrails専用みたい

導入方法

1,Gemfileにfactory_bot_railsを追記。

[Gemfile]
gem 'factory_bot_rails' 

2,bundle install

$bundle install

3,factoryを追加

$ bin/rails g factory_bot:model user

 create  spec/factories/users.rb

ここは使用したいスペックに合わせて変更してください。

今回はgenerateでuserモデルのファクトリを追加しました。

基本的な使い方

デフォルトでこのような記述のファイルが生成されます。

[spec/factories/users.rb]

FactoryBot.define do
  factory :user do  
  end
end

ここから先ほどお話していたfactory_botは便利にしてくれる機能について基本的な使い方を用いながら解説していきます。

比較対象としてまず、factory_botを使用していない場合について。

factory_botを使用しない場合

※今回は使い方を理解することなのでbeforeなどは使用していません

[spec/models/user_spec.rb]
it "userは有効な値であること" do
 user = User.new(
      first_name: "Aaron",
      last_name: "Sumner",
      email: "tester@example.com",
      password: "dottle-nouveau-pavilion-tights-furze",
    )
expect(user).to be_valid →成功

このテストは、Userの作成が成功していることを期待するテストになります。

このテストのみなら問題はありませんが、複数テストを扱うときに、毎回テストユーザーを作成していたらとても時間がかかります

そこでテストユーザーを管理しやすくすることのできるものが、factory_botになります。

1,factory_botでテストユーザーを作成準備

[spec/factories/user.rb]
FactoryBot.define do
  factory :user do
    name "name" 
    email "tester@example.com"
    password "password"
  end
end

2,テストを追加

[spec/models/user_spec.rb]
it "userは有効な値であること" do
    expect(FactoryBot.build(:user)).to be_valid
 end

これでOK!

FactoryBot.build(:user)とするだけでファクトリで定義したuserを使用することができます。

テストユーザー情報の上書き

基本的な使い方は以上になりますが、factory_botではユーザー情報を変更することもできます。

例えば、nameがない状態を作りたい場合。

user = FactoryBot.build(:user, name: nil)

これでテストユーザーのnameがnilで上書きされ、無効なテストも簡単に実装することができます。

まとめ

まだまだやらなければいけないことや便利な機能がたくさんありますが、今回は導入・基本的な使い方について焦点を当てて解説していきました。

本記事のゴールである

・factory_botは頻繁に使用する変数や情報を簡単に管理できるgemであるということ

・実際の使い方について理解できる

については達成できたかと思います。

最後まで読んでいただきありがとうございました!!

追記2021/4/15現在〜

factory_bot4.1.1以降では、name: "name"だとエラーになってしまう。

name: {"name"}にすればok。

https://qiita.com/jnchito/items/81637bbdf66c2662eacf

参考資料

https://qiita.com/at-946/items/aaff42e4a9c2e4dd58ed

https://github.com/thoughtbot/factory_bot_rails

https://github.com/thoughtbot/factory_bot