見出し画像

[Ruby on Rails]rspecを用いたmodelの単体テスト

備忘録として残します。

Gemのインストール

今回はrspecとFactoryBotというGemを用いてテストを行っていきます。

GemFileに以下の記述を行ってください。

gem 'rspec-rails'
gem 'factory_bot_rails'

FactoryBotはダミーのインスタンスを簡単に作成できるGemで、テストを書くスピードをあげることができます。
後ほど説明します。

記載したらbundle installしましょう。

$ bundle install

RSpecの設定

まずは以下コマンドを実行してください。

$ rails g rspec:install

このコマンドで作成された.rspecに以下の記述を行います。

--format documentation

上の記述はあってもなくてもいいのですが、あるなしでテスト実行時の表示がこのくらい変わります。

なし
$ ...............................

あり
$ User
$ #create
$   is valid
$   is invalid without email
$   is invalid without password 

どういうテストを行ったのかがわかるようになります。

FactoryBotの設定

続いてFactoryBotの設定を行います。

今回はUserモデルのバリデーションをテストするものとします。

spec/factoriesディレクトリにusers.rbというファイルを作成し、以下の記述を行ってください。

FactoryBot.define do

 factory :user do
   nickname              {"taro"}
   email                 {"kkk@gmail.com"}
   password              {"00000000"}
   password_confirmation {"00000000"}
 end
end

また、specディレクトリのrails_helper.rbに

    ・
    ・
    ・
RSpec.configure do |config|
 config.include FactoryBot::Syntax::Methods #この一文を記述する
    ・
    ・
    ・
end

これを行うことで、テストの度に毎回インスタンスを作成する記述を行わなくて済みます。

テストを書く

準備が整ったのでテストを書いていきましょう。

spec/modelsディレクトリを作成し、その中にuser_spec.rbファイルを作成します。
user_spec.rbに以下の記述をします。

require 'rails_helper'

describe User do
  describe '#create' do
    it 'is valid' do
      user = build(:user)
      user.valid?
      expect(user).to be_valid
    end
  end
end

requireでrails_helper.rbに記載した内容を読み込んでいます。

describeで囲うことで、テストをグループ化しています。

今回だとUserモデルにレコードをcreateする際のテストというのがわかりまます。

itで囲われた内容がテストになります。it~doの間に書かれている内容はテストの説明になります。日本語で書いても問題ありません。

テストの中身に入っていきます。

user = build(:user)

これがFactoryBotの恩恵です。

先ほどusers.rbに

factory :user do
   nickname              {"taro"}
   email                 {"kkk@gmail.com"}
   password              {"00000000"}
   password_confirmation {"00000000"}
 end

という記述を行いました。

この内容のインスタンスをbuild(:user)で作成してくれます。

つまり

user = build(:user)

user = User.new(nickname: "taro", email: "kkk@gmail.com", password: "00000000", password_confirmation: "00000000")

と同じになります。

多くのテストを記述する場合、かなり記述が楽になります。

user.valid?

でバリデーションを確認します。そして

expect(user).to be_valid

このexpectで指定された値がtoメソッドで指定した内容と一致すればテスト成功となります。

バリデーションクリアしたかどうかを確かめるためにbe_validメソッドを使用しています。

もう一つテストを紹介すると

it 'is invalid without email' do
  user = build(:user, email: "")
  user.valid?
  expect(user.errors[:email]).to include("can't be blank")
end

このテストは、emailカラムにpresence: trueのバリデーションがかかっているとして、emailに何も入力しなかった場合にバリデーションエラーが発生することを確かめるテストとなります。

このように起きてほしいことと起きて欲しくないことの両方をテストするようにしましょう。

まとめ

テストの記述って非常に重要だと思います。

大規模になればなるほど人手での確認は難しいですからね。

うっかりバリデーション書き忘れていた!とかの予防にもなります。

テスト駆動開発といって、テストを書いてから実際の開発コードを書き始めるような開発手法もあるようです。

テストの記述になれて、質の高い成果物を作成していきたいものです。

この記事が気に入ったらサポートをしてみませんか?