【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を指定しないとメール認証しろ!と言われるので記述。
こんな感じで他のテストもどんどん書いていこうと思います。
個人的には今までとは違うベクトルの難しさだったので割としんどかったです。