5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

OPENLOGIAdvent Calendar 2020

Day 17

Rspecを用いたテストにおけるfactory_botの利用

Last updated at Posted at 2020-12-17

はじめに

OPENLOGI Advent Calender 2020 の12月17日の記事です。

本日はオープンロジ歴4ヶ月の金井が担当します。
前職まではメーカー勤務で畑違いでしたが、ソフトウェアの品質管理に興味が湧きQAエンジニアとしてエンジニアのキャリアをスタートしました。

今年も終わりが近づき初心を振り返るために、入社前に 「QAエンジニアならテスト書かな!!」 と自作のアプリの単体テストを書いていたのでそれを振り返ってみようと思います。
(実際は開発者が単体テストを書いているので直接関与することはありませんでしたが、QAチームでテストの自動化に絶賛取り組んでいるので完全に無駄になることはないは、、ず。。。)

実装言語、環境は

  • Ruby2.5
  • Ruby on Rails5.2
    (自分の初学言語であり、社内では使用していないです。)

そもそもRspecとは

Ruby用のテスティングフレームワークです。
今回はRuby on RailsにRspecを導入します。

factory_botとは

Rspecでテストを書いていて、
毎度対象のインスタンスを生成(User.newのところ)するのは面倒です。
例えばこんな感じで(Userモデルの単体テスト)

require 'rails_helper'
describe User do
  describe '#create' do
    it "usernameがないと登録できない" do
      user = User.new(username: "", email: "test@example.com", password: "111111", password_confirmation: "111111")
      user.valid?
      expect(user.errors[:username]).to include("が入力されていません。")
    end

    it "emailがないと登録できない" do
      user = User.new(username: "テストさん", email: "", password: "111111", password_confirmation: "111111")
      user.valid?
      expect(user.errors[:email]).to include("が入力されていません。")
    end
  end
end

そこで使えるのが factory_botです。
予めインスタンスの情報を記述しておけば、User.newでいちいちインスタンスを生成せずに、
buildやcreateといったメソッドで簡単に呼び出すことができます。

factory_botの導入

まずGemfileに以下を記述します。

Gemfile
gem 'factory_bot_rails'

次にspecディレクトリ直下にfactoriesフォルダを作成し、
その配下にそれぞれのファイルを置いていくというのが慣例みたいです。
今回の例であればusers.rbファイルを新規作成します。

users.rb
FactoryBot.define do
  factory :user do
    username              {"テストさん"}
    email                 {"test@example.com"}
    password              {"111111"}
    password_confirmation {"111111"}
  end
end

これであとは呼び出すだけです。

*** factory_botの呼び出し

user = FactoryBot.build(:user)

作成したインスタンスは上記で生成されます。
今回はbuildメソッドですが、createメソッドでも生成されます。
createメソッドの場合は一時的にテスト用のDBにデータが保存されます。
例えば一意性の確認の時に、最初にcreateメソッドで1人目を登録しておくことで、
2人目が同じ内容を登録した時にバリデーションが働いているかを確認することができます。

そして、FactoryBotという記述を省略することができます。
そのためにはrails_helper.rbファイルに以下を記述しましょう。
このファイルはRspecをRailsにインストール後、
rails g rspec:instalで生成されるファイルの一つです。

rails_helper.rb
RSpec.configure do |config|
# 下記を追記
  config.include FactoryBot::Syntax::Methods

最終的にはこうなります。

# factory_bot導入前
user = User.new(username: "テストさん", email: "test@example.com", password: "111111", password_confirmation: "111111")

# factory_bot導入後
user = build(:user)

かなりスリムになりました!

ちなみに、特定の箇所を変更したい場合は以下の通りです。

user = build(:user, username: "")

これでusernameが空のインスタンスが生成されることになります。

最後に

簡単な内容だったと思いますが、数ヶ月前の自分のような初学者の助けになれたら幸いです。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?