【RSpec】user_specのメモ

昨日初めてRSpecに手を出しました。

そこで気がついたんですが、もっと早くやっておけば良かったと思います。

多分そこらへんはコードとテストをどっちを先に書くかみたいな話にもなるとは思うのですが、僕自身、ポートフォリオを作成中で、最低限の機能を追加した後はテストを書いておいたほうがかなり便利だなと後悔しています。

色々な記事を見て、頭を悩ませながらもuserのテストを先程書き終えたところです。

勉強してみて思ったのはかなり壮大というか奥が深い世界でした。

そして、見やすさだったり綺麗さ、どの程度までテストすればいいのかという感覚的な基準が初心者には難しいものです。

まあとりあえずシンプルにすれば良いんじゃないのかなと思い、user_specを書いたのでメモしておきます。user_specはこれから他のアプリケーションを作ったときも利用しそうなので。

require 'rails_helper'

RSpec.describe User, type: :model do

  it "有効なuserレコードが登録できること" do
    expect(FactoryBot.build(:user)).to be_valid
  end

  it "名前がないときは無効であること" do
    user = FactoryBot.build(:user, name: nil)
    user.valid?
    expect(user.errors[:name]).to include("を入力してください")
  end

  it "名前があるときは有効であること" do
    user = FactoryBot.build(:user, name: "taro")
    user.valid?
    expect(user).to be_valid
  end

  it "メールアドレスがないときは無効であること" do
    user = FactoryBot.build(:user, email: nil)
    user.valid?
    expect(user.errors[:email]).to include("を入力してください")
  end
  
  it "メールアドレスの形式が不正のときは無効であること" do
    user = FactoryBot.build(:user, email: "abc")
    user.valid?
    expect(user.errors[:email]).to include("は不正な値です")
  end

  it "メールアドレスの形式が正しいときは有効であること" do
    user = FactoryBot.build(:user, email: "aiueo@example.com")
    user.valid?
    expect(user).to be_valid
  end

  it "メールアドレスが他のユーザーと重複しているときは無効であること" do
    FactoryBot.create(:user, email: "hoge@example.com")
    user = FactoryBot.build(:user,email: "hoge@example.com")
    user.valid?
    expect(user.errors[:email]).to include('はすでに存在します')
  end

  it "パスワードがないときは無効であること" do
    user = FactoryBot.build(:user, password: nil)
    user.valid?
    expect(user.errors[:password]).to include('を入力してください')
  end

  it "パスワードが6文字未満のときは無効であること" do
    user = FactoryBot.build(:user, password: 'abcde')
    expect(user).to_not be_valid
  end

  it "パスワードが6文字以上のときは有効であること" do
    user = FactoryBot.build(:user, password: 'abcdef')
    expect(user).to be_valid
  end
end

色々ネストしたりできそうですが、正直beforeだったりcontextを使わないで書いたほうが綺麗になったのでこんな感じにしました。

FactoryBot.define do
  factory :user do
    name { "testuser" }
    email { "hogehoge@example.com" }
    password { "hogehoge" }
    confirmed_at { Date.current.in_time_zone }
  end
end

FactoryBotはこんな感じに。

deviseのメール認証を実装している場合はconfirmed_atを指定しないとメール認証しろ!と言われるので記述。

こんな感じで他のテストもどんどん書いていこうと思います。

個人的には今までとは違うベクトルの難しさだったので割としんどかったです。