LoginSignup
5
1

More than 1 year has passed since last update.

爆速でモデルテストを書き上げる!!![10分]

Last updated at Posted at 2019-10-10

はじめに

今回は爆速でモデルのテストを書き上げます!!
ぜひ参考に!!

前提

今回はUserモデルを例にとってテストを書き上げていきます!!

テーブル

カラム名 オプション
email This null: false
encrypted_password string null: false
nickname string
introduction text

※deviseを導入しているのでもう少しカラムがありますが、省略します。

バリデーション

user.rb
class User < ApplicationRecord
  〜省略〜
  validates :nickname, presence: true, length: { maximum: 6 }
  validates :introduction, presence: true
end

rspecの導入

Gemfile
group :development, :test do
  gem 'rspec-rails'
  gem 'factory_bot_rails'
end

group :development do
  gem 'web-console'
end

※web_console というgemはtest環境で動かすと不具合が起きる可能性があるgemなのでdevelopment環境でのみ動くようにします。

ターミナル
bundle install
ターミナル
rails g rspec:install

次のようなファイルが生成されます。

ターミナル
create  .rspec
create  spec
create  spec/spec_helper.rb
create  spec/rails_helper.rb

作成された.rspecに以下を追加

.rspec
--format documentation

rspec確認

ターミナル
bundle exec rspec
ターミナル
No examples found.


Finished in 0.00111 seconds (files took 0.19535 seconds to load)
0 examples, 0 failures

こんな感じになればOKです。

下準備

specディレクトリが作成されているはずです。
スクリーンショット 2019-10-10 21.19.49.png

その中にfactoriesディレクトリとmodelディレクトリを作成しましょう。

その後、
factoriesディレクトリの中にはusers.rb
modelディレクトリの中にはuser_spec.rb
というファイルを作成しましょう。

スクリーンショット 2019-10-10 21.28.24.png
上記のようになっていればOKです。

テストコードの記載

まずはspec/factories/user.rbにサンプルデータを作成します。

spec/factories/user.rb
FactoryBot.define do

  factory :user do
    nickname              {"山田太郎"}
    introduction          {"こんにちは"}
    email                 {"sample@gmail.com"}
    password              {"00000000"}
    password_confirmation {"00000000"}
  end

end

テストコードを書いていきます。

spec/model/user_spec.rb
require 'rails_helper'

describe User do
  describe '#create' do

    it "ニックネームがないと登録できない" do
      user = build(:user, nickname: nil)
      user.valid?
      expect(user.errors[:nickname]).to include("can't be blank")
    end

    it "ニックネームが7文字以上では登録できない " do
      user = build(:user, nickname: "aaaaaaaa")
      user.valid?
      expect(user.errors[:nickname][0]).to include("is too long")
    end

      it "自己紹介がないと登録できない" do
        user = build(:user, introduction: nil)
        user.valid?
        expect(user.errors[:introduction]).to include("can't be blank")
      end

    it "e-mailがないと登録できない" do
      user = build(:user, email: nil)
      user.valid?
      expect(user.errors[:email]).to include("can't be blank")
    end

    it "パスワードがないと登録できない" do
      user = build(:user, password: nil)
      user.valid?
      expect(user.errors[:password]).to include("can't be blank")
    end

    it "パスワード確認がないと登録できない" do
      user = build(:user, password_confirmation: "")
      user.valid?
      expect(user.errors[:password_confirmation]).to include("doesn't match Password")
    end

    it "全て満たしていれば登録できる" do
      user = build(:user)
      expect(user).to be_valid
    end

  end

end

テストコードのポイントは失敗例と成功例両方書いておくことです。
書けましたね。ターミナルで確認してみましょう!!!

ターミナル
bundle exec rspec
ターミナル
User
  #create
    ニックネームがないと登録できない
    ニックネームが7文字以上では登録できない
    自己紹介がないと登録できない
    e-mailがないと登録できない
    パスワードがないと登録できない
    パスワード確認がないと登録できない
    全て満たしていれば登録できる

Finished in 0.45572 seconds (files took 4.21 seconds to load)
7 examples, 0 failures

こんな感じで出れば成功です!!!
赤い文字でfailuresが出る場合はバリデーションかテストコードのどちらかが間違っているので確認してみましょう。

おわりに

とても簡単だったと思います。
今回はカラム数の少ないモデルでテストを行いましたが、カラム数が増えてもやることは同じです。
ぜひ参考にテストコードを書いてみましょう。
では:guardsman::guardsman:

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