【Rails6】 RSpec에 의한 투고시의 모델 단체 테스트의 구현
소개
서비스 품질을 유지하기 위해 필수적인 테스트를 실시하고 있습니다.
이번은 투고시의 모델(Definition 모델) 단체 테스트를 실시해, 그 내용을 기사로 했습니다.
향후 다른 모델에 대해서도 실시해 기사로 해 가고 싶습니다.
또 테스트는 추가로 실시해 가기 때문에, 향후도 투고시의 모델 단체 테스트의 내용을 추가해 갑니다.
전제
· 다음 gem은 설치됨
gem 'rspec-rails', '~> 4.0.0'
gem 'factory_bot_rails'
gem 'faker'
・투고 기능 실장 완료
버전
루비 버전 ruby-2.6.5
Rails 버전 Rails:6.0.0
rspec-rails 4.0.0
실시한 테스트
정의 테이블의 열 소개
xxx_create_definitions.rbclass CreateDefinitions < ActiveRecord::Migration[6.0]
def change
create_table :definitions do |t|
t.text :title, null: false
t.text :body, null: false
t.references :user, foreign_key: true
t.timestamps
end
end
end
모델 내 어소시에이션 및 검증
app/models/definition.rbclass Definition < ApplicationRecord
belongs_to :user
has_many :answers, dependent: :destroy
has_many :reviews, dependent: :destroy
has_many :notifications, dependent: :destroy
has_many :likes, dependent: :destroy
validates :title, presence: true
validates :body, presence: true
# 〜省略〜
FactoryBot의 내역
spec/factories/definitions.rbFactoryBot.define do
factory :definition do
title {Faker::Lorem.sentence}
body {Faker::Lorem.sentence}
association :user
end
end
테스트 코드 내용
spec/models/definition_spec.rbrequire 'rails_helper'
RSpec.describe Definition, type: :model do
before do
@definition = FactoryBot.build(:definition)
end
describe '投稿' do
context '投稿がうまくいくとき' do
it "内容に問題ない場合" do
expect(@definition).to be_valid
end
it "正しく保存できるか" do
expect(FactoryBot.build(:definition)).to be_valid
end
end
context '投稿が上手くいかないとき' do
it "titleが空だと登録できない" do
@definition.title = ''
@definition.valid?
expect(@definition.errors.full_messages).to include("Titleを入力してください")
end
it "bodyが空だと登録できない" do
@definition.body = ''
@definition.valid?
expect(@definition.errors.full_messages).to include("Bodyを入力してください")
end
end
end
describe "各モデルとのアソシエーション" do
let(:association) do
described_class.reflect_on_association(target)
end
let(:definition) { FactoryBot.create(:definition) }
context "Likeモデルとのアソシエーション" do
let(:target) { :likes }
it "Likeとの関連付けはhas_manyであること" do
expect(association.macro).to eq :has_many
end
it "Defintionが削除されたらLikeも削除されること" do
like = FactoryBot.create(:like, definition_id: definition.id)
expect { definition.destroy }.to change(Like, :count).by(-1)
end
end
context "Answerモデルとのアソシエーション" do
let(:target) { :answers }
it "Answerとの関連付けはhas_manyであること" do
expect(association.macro).to eq :has_many
end
it "Definitionが削除されたらAnswerも削除されること" do
answer = FactoryBot.create(:answer, definition_id: definition.id)
expect { definition.destroy }.to change(Answer, :count).by(-1)
end
end
end
end
이상입니다.
Reference
이 문제에 관하여(【Rails6】 RSpec에 의한 투고시의 모델 단체 테스트의 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/narimiya/items/301dd9a10f32e0061cff
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
· 다음 gem은 설치됨
gem 'rspec-rails', '~> 4.0.0'
gem 'factory_bot_rails'
gem 'faker'
・투고 기능 실장 완료
버전
루비 버전 ruby-2.6.5
Rails 버전 Rails:6.0.0
rspec-rails 4.0.0
실시한 테스트
정의 테이블의 열 소개
xxx_create_definitions.rbclass CreateDefinitions < ActiveRecord::Migration[6.0]
def change
create_table :definitions do |t|
t.text :title, null: false
t.text :body, null: false
t.references :user, foreign_key: true
t.timestamps
end
end
end
모델 내 어소시에이션 및 검증
app/models/definition.rbclass Definition < ApplicationRecord
belongs_to :user
has_many :answers, dependent: :destroy
has_many :reviews, dependent: :destroy
has_many :notifications, dependent: :destroy
has_many :likes, dependent: :destroy
validates :title, presence: true
validates :body, presence: true
# 〜省略〜
FactoryBot의 내역
spec/factories/definitions.rbFactoryBot.define do
factory :definition do
title {Faker::Lorem.sentence}
body {Faker::Lorem.sentence}
association :user
end
end
테스트 코드 내용
spec/models/definition_spec.rbrequire 'rails_helper'
RSpec.describe Definition, type: :model do
before do
@definition = FactoryBot.build(:definition)
end
describe '投稿' do
context '投稿がうまくいくとき' do
it "内容に問題ない場合" do
expect(@definition).to be_valid
end
it "正しく保存できるか" do
expect(FactoryBot.build(:definition)).to be_valid
end
end
context '投稿が上手くいかないとき' do
it "titleが空だと登録できない" do
@definition.title = ''
@definition.valid?
expect(@definition.errors.full_messages).to include("Titleを入力してください")
end
it "bodyが空だと登録できない" do
@definition.body = ''
@definition.valid?
expect(@definition.errors.full_messages).to include("Bodyを入力してください")
end
end
end
describe "各モデルとのアソシエーション" do
let(:association) do
described_class.reflect_on_association(target)
end
let(:definition) { FactoryBot.create(:definition) }
context "Likeモデルとのアソシエーション" do
let(:target) { :likes }
it "Likeとの関連付けはhas_manyであること" do
expect(association.macro).to eq :has_many
end
it "Defintionが削除されたらLikeも削除されること" do
like = FactoryBot.create(:like, definition_id: definition.id)
expect { definition.destroy }.to change(Like, :count).by(-1)
end
end
context "Answerモデルとのアソシエーション" do
let(:target) { :answers }
it "Answerとの関連付けはhas_manyであること" do
expect(association.macro).to eq :has_many
end
it "Definitionが削除されたらAnswerも削除されること" do
answer = FactoryBot.create(:answer, definition_id: definition.id)
expect { definition.destroy }.to change(Answer, :count).by(-1)
end
end
end
end
이상입니다.
Reference
이 문제에 관하여(【Rails6】 RSpec에 의한 투고시의 모델 단체 테스트의 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/narimiya/items/301dd9a10f32e0061cff
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
정의 테이블의 열 소개
xxx_create_definitions.rbclass CreateDefinitions < ActiveRecord::Migration[6.0]
def change
create_table :definitions do |t|
t.text :title, null: false
t.text :body, null: false
t.references :user, foreign_key: true
t.timestamps
end
end
end
모델 내 어소시에이션 및 검증
app/models/definition.rbclass Definition < ApplicationRecord
belongs_to :user
has_many :answers, dependent: :destroy
has_many :reviews, dependent: :destroy
has_many :notifications, dependent: :destroy
has_many :likes, dependent: :destroy
validates :title, presence: true
validates :body, presence: true
# 〜省略〜
FactoryBot의 내역
spec/factories/definitions.rbFactoryBot.define do
factory :definition do
title {Faker::Lorem.sentence}
body {Faker::Lorem.sentence}
association :user
end
end
테스트 코드 내용
spec/models/definition_spec.rbrequire 'rails_helper'
RSpec.describe Definition, type: :model do
before do
@definition = FactoryBot.build(:definition)
end
describe '投稿' do
context '投稿がうまくいくとき' do
it "内容に問題ない場合" do
expect(@definition).to be_valid
end
it "正しく保存できるか" do
expect(FactoryBot.build(:definition)).to be_valid
end
end
context '投稿が上手くいかないとき' do
it "titleが空だと登録できない" do
@definition.title = ''
@definition.valid?
expect(@definition.errors.full_messages).to include("Titleを入力してください")
end
it "bodyが空だと登録できない" do
@definition.body = ''
@definition.valid?
expect(@definition.errors.full_messages).to include("Bodyを入力してください")
end
end
end
describe "各モデルとのアソシエーション" do
let(:association) do
described_class.reflect_on_association(target)
end
let(:definition) { FactoryBot.create(:definition) }
context "Likeモデルとのアソシエーション" do
let(:target) { :likes }
it "Likeとの関連付けはhas_manyであること" do
expect(association.macro).to eq :has_many
end
it "Defintionが削除されたらLikeも削除されること" do
like = FactoryBot.create(:like, definition_id: definition.id)
expect { definition.destroy }.to change(Like, :count).by(-1)
end
end
context "Answerモデルとのアソシエーション" do
let(:target) { :answers }
it "Answerとの関連付けはhas_manyであること" do
expect(association.macro).to eq :has_many
end
it "Definitionが削除されたらAnswerも削除されること" do
answer = FactoryBot.create(:answer, definition_id: definition.id)
expect { definition.destroy }.to change(Answer, :count).by(-1)
end
end
end
end
이상입니다.
Reference
이 문제에 관하여(【Rails6】 RSpec에 의한 투고시의 모델 단체 테스트의 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/narimiya/items/301dd9a10f32e0061cff
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
class CreateDefinitions < ActiveRecord::Migration[6.0]
def change
create_table :definitions do |t|
t.text :title, null: false
t.text :body, null: false
t.references :user, foreign_key: true
t.timestamps
end
end
end
app/models/definition.rb
class Definition < ApplicationRecord
belongs_to :user
has_many :answers, dependent: :destroy
has_many :reviews, dependent: :destroy
has_many :notifications, dependent: :destroy
has_many :likes, dependent: :destroy
validates :title, presence: true
validates :body, presence: true
# 〜省略〜
FactoryBot의 내역
spec/factories/definitions.rbFactoryBot.define do
factory :definition do
title {Faker::Lorem.sentence}
body {Faker::Lorem.sentence}
association :user
end
end
테스트 코드 내용
spec/models/definition_spec.rbrequire 'rails_helper'
RSpec.describe Definition, type: :model do
before do
@definition = FactoryBot.build(:definition)
end
describe '投稿' do
context '投稿がうまくいくとき' do
it "内容に問題ない場合" do
expect(@definition).to be_valid
end
it "正しく保存できるか" do
expect(FactoryBot.build(:definition)).to be_valid
end
end
context '投稿が上手くいかないとき' do
it "titleが空だと登録できない" do
@definition.title = ''
@definition.valid?
expect(@definition.errors.full_messages).to include("Titleを入力してください")
end
it "bodyが空だと登録できない" do
@definition.body = ''
@definition.valid?
expect(@definition.errors.full_messages).to include("Bodyを入力してください")
end
end
end
describe "各モデルとのアソシエーション" do
let(:association) do
described_class.reflect_on_association(target)
end
let(:definition) { FactoryBot.create(:definition) }
context "Likeモデルとのアソシエーション" do
let(:target) { :likes }
it "Likeとの関連付けはhas_manyであること" do
expect(association.macro).to eq :has_many
end
it "Defintionが削除されたらLikeも削除されること" do
like = FactoryBot.create(:like, definition_id: definition.id)
expect { definition.destroy }.to change(Like, :count).by(-1)
end
end
context "Answerモデルとのアソシエーション" do
let(:target) { :answers }
it "Answerとの関連付けはhas_manyであること" do
expect(association.macro).to eq :has_many
end
it "Definitionが削除されたらAnswerも削除されること" do
answer = FactoryBot.create(:answer, definition_id: definition.id)
expect { definition.destroy }.to change(Answer, :count).by(-1)
end
end
end
end
이상입니다.
Reference
이 문제에 관하여(【Rails6】 RSpec에 의한 투고시의 모델 단체 테스트의 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/narimiya/items/301dd9a10f32e0061cff
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
FactoryBot.define do
factory :definition do
title {Faker::Lorem.sentence}
body {Faker::Lorem.sentence}
association :user
end
end
spec/models/definition_spec.rb
require 'rails_helper'
RSpec.describe Definition, type: :model do
before do
@definition = FactoryBot.build(:definition)
end
describe '投稿' do
context '投稿がうまくいくとき' do
it "内容に問題ない場合" do
expect(@definition).to be_valid
end
it "正しく保存できるか" do
expect(FactoryBot.build(:definition)).to be_valid
end
end
context '投稿が上手くいかないとき' do
it "titleが空だと登録できない" do
@definition.title = ''
@definition.valid?
expect(@definition.errors.full_messages).to include("Titleを入力してください")
end
it "bodyが空だと登録できない" do
@definition.body = ''
@definition.valid?
expect(@definition.errors.full_messages).to include("Bodyを入力してください")
end
end
end
describe "各モデルとのアソシエーション" do
let(:association) do
described_class.reflect_on_association(target)
end
let(:definition) { FactoryBot.create(:definition) }
context "Likeモデルとのアソシエーション" do
let(:target) { :likes }
it "Likeとの関連付けはhas_manyであること" do
expect(association.macro).to eq :has_many
end
it "Defintionが削除されたらLikeも削除されること" do
like = FactoryBot.create(:like, definition_id: definition.id)
expect { definition.destroy }.to change(Like, :count).by(-1)
end
end
context "Answerモデルとのアソシエーション" do
let(:target) { :answers }
it "Answerとの関連付けはhas_manyであること" do
expect(association.macro).to eq :has_many
end
it "Definitionが削除されたらAnswerも削除されること" do
answer = FactoryBot.create(:answer, definition_id: definition.id)
expect { definition.destroy }.to change(Answer, :count).by(-1)
end
end
end
end
이상입니다.
Reference
이 문제에 관하여(【Rails6】 RSpec에 의한 투고시의 모델 단체 테스트의 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/narimiya/items/301dd9a10f32e0061cff텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)