UserモデルをRSpecでテストする

自動生成の設定をしましたがblogモデル、userモデルはすでに作成されているので、テストファイルを新しく作成します。

まずはuserモデルを作成します。

$ rails g rspec:model user

まずはアウトラインを記載していきます。 (spec/models/user_spec.rb)

require 'rails_helper'

RSpec.describe User, type: :model do
  it "名前、メール、パスワードがあれば有効な状態であること"
  it "名前がなければ無効な状態であること"
  it "メールアドレスがなければ無効な状態であること"
  it "パスワードがなければ無効な状態であること"
  it "重複したメールアドレスなら無効な状態であること"
  it "パスワードが6文字以上でなければ無効な状態であること"
end

1つ目のテストを記載していきます。

it "名前、メール、パスワードがあれば有効な状態であること" do
    user = User.new(
      name: "tester",
      email: "tester@example.com",
      password: "password",
    )
    expect(user).to be_valid 
  end

問題なくパス。

2つ目のテスト"名前がなければ無効な状態であること" で、userのnameにバリデーションがかかっていないことを発見した。

it "名前がなければ無効な状態であること" do
    user = User.new(name:nil)
    user.valid?
    expect(user.errors[:name]).to include"を入力してください"
  end
$ bin/rspec
(省略)
1) User 名前がなければ無効な状態であること
     Failure/Error: expect(user.errors[:name]).to include"を入力してください"
       expected [] to include "名前を入力してください"
     # ./spec/models/user_spec.rb:16:in `block (2 levels) in <main>'
     # -e:1:in `<main>'

さっそく修正。 (app/models/user.rb)

# (追記)
validates :name, presence: true

これでテストがパスした。

it "メールアドレスがなければ無効な状態であること" do
  user = User.new(email: nil)
  user.valid?
  expect(user.errors[:email]).to include("を入力してください")
end

it "重複したメールアドレスなら無効な状態であること" do
  User.create(
  name: "hoge", 
  email: "tester@example.com", 
  password: "password",
  )
  user = User.new(
    name: "fuga",
    email: "tester@example.com",
    password: "password", 
  )
  user.valid?
  expect(user.errors[:email]).to include("はすでに存在します")
end

it "パスワードが6文字以上でなければ無効な状態であること" do
  user = User.new(password: "hoge")
  user.valid?
  expect(user.errors[:password]).to include("は6文字以上で入力してください")
end