LoginSignup
0
0

More than 1 year has passed since last update.

🔰【初学者用】RSpecでテストコードを書こう!⑤【FactoryBot・Faker】

Posted at

はじめに

今回でテストコードについては最後の投稿になります。
前回までの投稿はこちら↓

①🔰【初学者用】RSpecでテストコードを書こう!【概念・準備】

②🔰【初学者用】RSpecでテストコードを書こう!②【簡単な実装例】

③🔰【初学者用】RSpecでテストコードを書こう!③【コントローラーの単体テスト簡単な実装例】

🔰【初学者用】RSpecでテストコードを書こう!④【結合テストの簡単な実装例】

# FactoryBot
テストコードを書く際に、user = User.new(nickname: '', email: 'test@example', password: '000000', password_confirmation: '000000')のような形でユーザーを生成する記述を都度記述していくのは大変ですよね。

そういう時に役立つのがFactoryBotというGemになります。
まずは導入から!

Gemfile
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'rspec-rails', '~> 4.0.0'
  gem 'factory_bot_rails' #追記
end

group :development, :test do内に記述します!
bundle installもお忘れなく!

次にFactoryBotの内容を記述するfactoriesディレクトリをspecディレクトリ内に作成します(手動でOK)。加えて、factriesディレクトリの中にusers.rbファイルを作成します。(今回はuserにしてますが、投稿であればpost.rbのように、その都度変えてください。)

FactoryBot内に記述していきます。

spec/factories/users.rb
FactoryBot.define do
  factory :user do
    nickname              {'test'}
    email                 {'test@example'}
    password              {'000000'}
    password_confirmation {password}
  end
end

続いてここで作成した記述をテストコードに反映させます。

spec/models/user_spec.rb
require 'rails_helper'
RSpec.describe User, type: :model do
  before do
    @user = FactoryBot.build(:user)
  end

  describe 'ユーザー新規登録' do
    it 'nicknameが空では登録できない' do
      @user.nickname = ''
      @user.valid?
      expect(@user.errors.full_messages).to include "Nickname can't be blank"
    end
    it 'emailが空では登録できない' do
      @user.email = ''
      @user.valid?
      expect(@user.errors.full_messages).to include "Email can't be blank"
    end
  end
end

3〜5行目のように記述することでspec/factories/users.rb内で記述した内容がspec/models/user_spec.rbファイルにも生成されます。

before do
  @user = FactoryBot.build(:user)
end

build

buildはActiveRecordのnewメソッドと同様の意味を持ちます。
つまりFactoryBot.build(:user) = user = User.new(nickname: 'test', email: 'test@example', password: '000000', password_confirmation: '00000000')ということ。これを見れば、どちらが効率的か明確ですね!笑

Faker

続いてランダムな値を出力するFakerを使用していきます。
まずは導入から

Gemfile
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'rspec-rails', '~> 4.0.0'
  gem 'factory_bot_rails'
  gem 'faker' #追記
end

忘れずbundle install
先程記述したspec/factories/users.rbを編集します!

spec/factories/users.rb
FactoryBot.define do
  factory :user do
    nickname              {Faker::Name.initials(number: 2)}
    email                 {Faker::Internet.free_email}
    password              {Faker::Internet.password(min_length: 6)}
    password_confirmation {password}
  end
end

Fakerはランダムな値を生成してくれます。メールアドレス、人名、パスワードなど、さまざまな意図に応じたランダムな値を生成してくれます。他にもたくさん使い道はあるので調べてみましょう!

記入を終えたら下記コマンドでテストを実行してください。

ターミナル
bundle exec rspec spec/models/user_spec.rb 

終わりに

①〜⑤に渡りテストコードの簡単な使い方をまとめました。もっと深ぼらなければならない部分はたくさんありますが、簡単な流れだけは分かるのではないかと思います!
それではまた。

0
0
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
0
0