6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails6】 RSpecによるLikeのモデル単体テストの実装

Last updated at Posted at 2021-03-01

#はじめに
サービスの品質を保つために必要不可欠なテストを実施しております。
今回はLikeモデル編ということで、今後他のモデルについても実施し記事にしていきたいと思います。

#前提
・以下のgemはインストール済み

  gem 'rspec-rails', '~> 4.0.0'
  gem 'factory_bot_rails'
  gem 'faker'

・いいね機能実装済み

#バージョン
rubyのバージョン ruby-2.6.5
Railsのバージョン Rails:6.0.0
rspec-rails 4.0.0

#実施したテスト
image.png

#likesテーブルのカラムの紹介

xxx_create_likes.rb
class CreateLikes < ActiveRecord::Migration[6.0]
  def change
    create_table :likes do |t|
      t.references :user,       foreign_key: true
      t.references :answer,     foreign_key: true
      t.references :definition,     foreign_key: true
      t.timestamps
    end
  end
end

image.png

#モデル内のバリデーション

app/models/like.rb
class Like < ApplicationRecord
  belongs_to :user
  belongs_to :answer
  belongs_to :definition

  validates :user_id, presence: true
  validates :answer_id, uniqueness: { scope: :user_id }, presence: true
  validates :definition_id, uniqueness: { scope: :user_id }, presence: true
end

#FactoryBotの内訳

spec/factories/likes.rb
FactoryBot.define do
  factory :like do
    association :answer
    association :definition
    user { answer.user }
  end
end

#テストコードの内容

spec/models/like_spec.rb

require 'rails_helper'

RSpec.describe Like, type: :model do
  before do
    @like = FactoryBot.build(:like)
  end
  describe '正常値と異常値の確認' do
    context 'likeモデルのバリデーション' do
      it "user_idとanswer_id、definition_idがあれば保存できる" do
        expect(FactoryBot.create(:like)).to be_valid
      end

      it "user_idがなければ無効な状態であること" do
        @like.user_id = nil
        @like.valid?
        expect(@like.errors[:user_id]).to include("を入力してください")
      end

      it "answer_idがなければ無効な状態であること" do
        @like.answer_id = nil
        @like.valid?
        expect(@like.errors[:answer_id]).to include("を入力してください")
      end

      it "definition_idがなければ無効な状態であること" do
        @like.definition_id = nil
        @like.valid?
        expect(@like.errors[:definition_id]).to include("を入力してください")
      end

      it "answer_idが同じでもuser_idが違うと保存できる" do
        like = FactoryBot.create(:like)
        expect(FactoryBot.create(:like, answer_id: like.answer_id)).to be_valid
      end

      it "definition_idが同じでもuser_idが違うと保存できる" do
        like = FactoryBot.create(:like)
        expect(FactoryBot.create(:like, definition_id: like.definition_id)).to be_valid
      end

      it "user_idが同じでもanswer_idが違うと保存できる" do
        like = FactoryBot.create(:like)
        expect(FactoryBot.create(:like, user_id: like.user_id)).to be_valid
      end
    end
  end
end

#補足説明
##Factorybotのassociationメソッドについて
オブジェクト(userオブジェクト、answerオブジェクト、definitionオブジェクト)同士の関連付けを行うために使用しています。

例)
以下のようにanswerオブジェクトの記述をするためには、それに紐づくuserオブジェクトの情報を記述する必要があります。

like_spec.rb
user = FactoryBot.create(:user)
answer = FactoryBot.create(:answer, user: user)

associationメソッドを使用することで、オブジェクト同士の関連付けを行えるため、以下のように1行での記述で済ませることができます。

like_spec.rb
answer = FactoryBot.create(:answer)

##Factorybotのuser { answer.user }について
詳細は以下URLより。
https://qiita.com/Ryoga_aoym/items/741c57e266a9d811a2d4

以上です。

6
2
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
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?