【Rails6】 RSpec에 의한 Relationship의 모델 단위 테스트의 구현
소개
서비스 품질을 유지하기 위해 필수적인 테스트를 실시하고 있습니다.
이번은 Relationship(팔로우) 모델편이라고 하는 것으로, 향후 다른 모델에 대해서도 실시해 기사로 해 가고 싶습니다.
※ Relationship 모델 이외의 기술에 관해서는 생략하고 있습니다.
나중에 알림 기능에 대한 기사를 올리기 위해 그 때 자세한 내용을 올립니다.
전제
· 다음 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
실시한 테스트
relationships 테이블의 열 소개
xxx_create_relationships.rbclass CreateRelationships < ActiveRecord::Migration[6.0]
def change
create_table :relationships do |t|
t.integer :follower_id
t.integer :followed_id
t.timestamps
end
end
end
모델의 유효성 검사
app/models/relationship.rbclass Relationship < ApplicationRecord
belongs_to :follower, class_name: 'User'
belongs_to :followed, class_name: 'User'
validates :follower_id, presence: true, uniqueness: { scope: :followed_id }
validates :followed_id, presence: true
end
FactoryBot의 내역
spec/factories/rerationships.rbFactoryBot.define do
factory :relationship do
follower_id { FactoryBot.create(:user).id }
followed_id { FactoryBot.create(:user).id }
end
end
테스트 코드 내용
spec/models/relationship_spec.rbrequire 'rails_helper'
RSpec.describe Relationship, type: :model do
let(:relationship) { FactoryBot.create(:relationship) }
describe '#create' do
context "保存できる場合" do
it "全てのパラメーターが揃っていれば保存できる" do
expect(relationship).to be_valid
end
end
context "保存できない場合" do
it "follower_idがnilの場合は保存できない" do
relationship.follower_id = nil
relationship.valid?
expect(relationship.errors[:follower_id]).to include("を入力してください")
end
it "followed_idがnilの場合は保存できない" do
relationship.followed_id = nil
relationship.valid?
expect(relationship.errors[:followed_id]).to include("を入力してください")
end
end
context "一意性の検証" do
before do
@relation = FactoryBot.create(:relationship)
@user1 = FactoryBot.build(:relationship)
end
it "follower_idとfollowed_idの組み合わせは一意でなければ保存できない" do
relation2 = FactoryBot.build(:relationship, follower_id: @relation.follower_id, followed_id: @relation.followed_id)
relation2.valid?
expect(relation2.errors[:follower_id]).to include("はすでに存在します")
end
it "follower_idが同じでもfollowed_idが違うなら保存できる" do
relation2 = FactoryBot.build(:relationship, follower_id: @relation.follower_id, followed_id: @user1.followed_id)
expect(relation2).to be_valid
end
it "follower_idが違うならfollowed_idが同じでも保存できる" do
relation2 = FactoryBot.build(:relationship, follower_id: @user1.follower_id, followed_id: @relation.followed_id)
expect(relation2).to be_valid
end
end
end
describe "各モデルとのアソシエーション" do
let(:association) do
described_class.reflect_on_association(target)
end
context "仮想モデルfollowerとのアソシエーション" do
let(:target) { :follower }
it "Followerとの関連付けはbelongs_toであること" do
expect(association.macro).to eq :belongs_to
end
end
context "仮想モデルfollowedとのアソシエーション" do
let(:target) { :followed }
it "Followedとの関連付けはbelongs_toであること" do
expect(association.macro).to eq :belongs_to
end
end
end
end
보충 설명
테스트 코드의 내용에 대해
다음과 같이 테스트를 크게 4개로 나누어 실시했습니다.
①보존할 수 있는 경우의 정상계
②보존할 수 없는 경우의 이상계
③ 고유성의 담보
④ 각 모델과의 어소시에이션
①, ②에 대해
follower_id와 followed_id의 유무에 의한 밸리데이션을 실시하고 있습니다.
③에 대해
follower_id와 followed_id의 조합을 검증하고 있습니다.
시점으로서는 팔로우되는 측과 팔로우하는 측 크게 2개 있습니다.
한 사용자가 @user1이라고 가정했습니다.
자신과 다른 ID의 경우 팔로우 할 수 있습니다. 즉, 자신이 팔로우 할 수없는 것을 테스트하고 있습니다.
또, 팔로우하는 측은 같은 사람에게는 1회 밖에 팔로우를 할 수 있는 테스트도 실시하고 있습니다.
④에 대해
각 모델과의 어소시에이션의 밸리데이션을 실시하고 있습니다.
이상입니다.
Reference
이 문제에 관하여(【Rails6】 RSpec에 의한 Relationship의 모델 단위 테스트의 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/narimiya/items/11429a0064383fb177ee
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 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
실시한 테스트
relationships 테이블의 열 소개
xxx_create_relationships.rbclass CreateRelationships < ActiveRecord::Migration[6.0]
def change
create_table :relationships do |t|
t.integer :follower_id
t.integer :followed_id
t.timestamps
end
end
end
모델의 유효성 검사
app/models/relationship.rbclass Relationship < ApplicationRecord
belongs_to :follower, class_name: 'User'
belongs_to :followed, class_name: 'User'
validates :follower_id, presence: true, uniqueness: { scope: :followed_id }
validates :followed_id, presence: true
end
FactoryBot의 내역
spec/factories/rerationships.rbFactoryBot.define do
factory :relationship do
follower_id { FactoryBot.create(:user).id }
followed_id { FactoryBot.create(:user).id }
end
end
테스트 코드 내용
spec/models/relationship_spec.rbrequire 'rails_helper'
RSpec.describe Relationship, type: :model do
let(:relationship) { FactoryBot.create(:relationship) }
describe '#create' do
context "保存できる場合" do
it "全てのパラメーターが揃っていれば保存できる" do
expect(relationship).to be_valid
end
end
context "保存できない場合" do
it "follower_idがnilの場合は保存できない" do
relationship.follower_id = nil
relationship.valid?
expect(relationship.errors[:follower_id]).to include("を入力してください")
end
it "followed_idがnilの場合は保存できない" do
relationship.followed_id = nil
relationship.valid?
expect(relationship.errors[:followed_id]).to include("を入力してください")
end
end
context "一意性の検証" do
before do
@relation = FactoryBot.create(:relationship)
@user1 = FactoryBot.build(:relationship)
end
it "follower_idとfollowed_idの組み合わせは一意でなければ保存できない" do
relation2 = FactoryBot.build(:relationship, follower_id: @relation.follower_id, followed_id: @relation.followed_id)
relation2.valid?
expect(relation2.errors[:follower_id]).to include("はすでに存在します")
end
it "follower_idが同じでもfollowed_idが違うなら保存できる" do
relation2 = FactoryBot.build(:relationship, follower_id: @relation.follower_id, followed_id: @user1.followed_id)
expect(relation2).to be_valid
end
it "follower_idが違うならfollowed_idが同じでも保存できる" do
relation2 = FactoryBot.build(:relationship, follower_id: @user1.follower_id, followed_id: @relation.followed_id)
expect(relation2).to be_valid
end
end
end
describe "各モデルとのアソシエーション" do
let(:association) do
described_class.reflect_on_association(target)
end
context "仮想モデルfollowerとのアソシエーション" do
let(:target) { :follower }
it "Followerとの関連付けはbelongs_toであること" do
expect(association.macro).to eq :belongs_to
end
end
context "仮想モデルfollowedとのアソシエーション" do
let(:target) { :followed }
it "Followedとの関連付けはbelongs_toであること" do
expect(association.macro).to eq :belongs_to
end
end
end
end
보충 설명
테스트 코드의 내용에 대해
다음과 같이 테스트를 크게 4개로 나누어 실시했습니다.
①보존할 수 있는 경우의 정상계
②보존할 수 없는 경우의 이상계
③ 고유성의 담보
④ 각 모델과의 어소시에이션
①, ②에 대해
follower_id와 followed_id의 유무에 의한 밸리데이션을 실시하고 있습니다.
③에 대해
follower_id와 followed_id의 조합을 검증하고 있습니다.
시점으로서는 팔로우되는 측과 팔로우하는 측 크게 2개 있습니다.
한 사용자가 @user1이라고 가정했습니다.
자신과 다른 ID의 경우 팔로우 할 수 있습니다. 즉, 자신이 팔로우 할 수없는 것을 테스트하고 있습니다.
또, 팔로우하는 측은 같은 사람에게는 1회 밖에 팔로우를 할 수 있는 테스트도 실시하고 있습니다.
④에 대해
각 모델과의 어소시에이션의 밸리데이션을 실시하고 있습니다.
이상입니다.
Reference
이 문제에 관하여(【Rails6】 RSpec에 의한 Relationship의 모델 단위 테스트의 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/narimiya/items/11429a0064383fb177ee
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
relationships 테이블의 열 소개
xxx_create_relationships.rbclass CreateRelationships < ActiveRecord::Migration[6.0]
def change
create_table :relationships do |t|
t.integer :follower_id
t.integer :followed_id
t.timestamps
end
end
end
모델의 유효성 검사
app/models/relationship.rbclass Relationship < ApplicationRecord
belongs_to :follower, class_name: 'User'
belongs_to :followed, class_name: 'User'
validates :follower_id, presence: true, uniqueness: { scope: :followed_id }
validates :followed_id, presence: true
end
FactoryBot의 내역
spec/factories/rerationships.rbFactoryBot.define do
factory :relationship do
follower_id { FactoryBot.create(:user).id }
followed_id { FactoryBot.create(:user).id }
end
end
테스트 코드 내용
spec/models/relationship_spec.rbrequire 'rails_helper'
RSpec.describe Relationship, type: :model do
let(:relationship) { FactoryBot.create(:relationship) }
describe '#create' do
context "保存できる場合" do
it "全てのパラメーターが揃っていれば保存できる" do
expect(relationship).to be_valid
end
end
context "保存できない場合" do
it "follower_idがnilの場合は保存できない" do
relationship.follower_id = nil
relationship.valid?
expect(relationship.errors[:follower_id]).to include("を入力してください")
end
it "followed_idがnilの場合は保存できない" do
relationship.followed_id = nil
relationship.valid?
expect(relationship.errors[:followed_id]).to include("を入力してください")
end
end
context "一意性の検証" do
before do
@relation = FactoryBot.create(:relationship)
@user1 = FactoryBot.build(:relationship)
end
it "follower_idとfollowed_idの組み合わせは一意でなければ保存できない" do
relation2 = FactoryBot.build(:relationship, follower_id: @relation.follower_id, followed_id: @relation.followed_id)
relation2.valid?
expect(relation2.errors[:follower_id]).to include("はすでに存在します")
end
it "follower_idが同じでもfollowed_idが違うなら保存できる" do
relation2 = FactoryBot.build(:relationship, follower_id: @relation.follower_id, followed_id: @user1.followed_id)
expect(relation2).to be_valid
end
it "follower_idが違うならfollowed_idが同じでも保存できる" do
relation2 = FactoryBot.build(:relationship, follower_id: @user1.follower_id, followed_id: @relation.followed_id)
expect(relation2).to be_valid
end
end
end
describe "各モデルとのアソシエーション" do
let(:association) do
described_class.reflect_on_association(target)
end
context "仮想モデルfollowerとのアソシエーション" do
let(:target) { :follower }
it "Followerとの関連付けはbelongs_toであること" do
expect(association.macro).to eq :belongs_to
end
end
context "仮想モデルfollowedとのアソシエーション" do
let(:target) { :followed }
it "Followedとの関連付けはbelongs_toであること" do
expect(association.macro).to eq :belongs_to
end
end
end
end
보충 설명
테스트 코드의 내용에 대해
다음과 같이 테스트를 크게 4개로 나누어 실시했습니다.
①보존할 수 있는 경우의 정상계
②보존할 수 없는 경우의 이상계
③ 고유성의 담보
④ 각 모델과의 어소시에이션
①, ②에 대해
follower_id와 followed_id의 유무에 의한 밸리데이션을 실시하고 있습니다.
③에 대해
follower_id와 followed_id의 조합을 검증하고 있습니다.
시점으로서는 팔로우되는 측과 팔로우하는 측 크게 2개 있습니다.
한 사용자가 @user1이라고 가정했습니다.
자신과 다른 ID의 경우 팔로우 할 수 있습니다. 즉, 자신이 팔로우 할 수없는 것을 테스트하고 있습니다.
또, 팔로우하는 측은 같은 사람에게는 1회 밖에 팔로우를 할 수 있는 테스트도 실시하고 있습니다.
④에 대해
각 모델과의 어소시에이션의 밸리데이션을 실시하고 있습니다.
이상입니다.
Reference
이 문제에 관하여(【Rails6】 RSpec에 의한 Relationship의 모델 단위 테스트의 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/narimiya/items/11429a0064383fb177ee
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
class CreateRelationships < ActiveRecord::Migration[6.0]
def change
create_table :relationships do |t|
t.integer :follower_id
t.integer :followed_id
t.timestamps
end
end
end
app/models/relationship.rb
class Relationship < ApplicationRecord
belongs_to :follower, class_name: 'User'
belongs_to :followed, class_name: 'User'
validates :follower_id, presence: true, uniqueness: { scope: :followed_id }
validates :followed_id, presence: true
end
FactoryBot의 내역
spec/factories/rerationships.rbFactoryBot.define do
factory :relationship do
follower_id { FactoryBot.create(:user).id }
followed_id { FactoryBot.create(:user).id }
end
end
테스트 코드 내용
spec/models/relationship_spec.rbrequire 'rails_helper'
RSpec.describe Relationship, type: :model do
let(:relationship) { FactoryBot.create(:relationship) }
describe '#create' do
context "保存できる場合" do
it "全てのパラメーターが揃っていれば保存できる" do
expect(relationship).to be_valid
end
end
context "保存できない場合" do
it "follower_idがnilの場合は保存できない" do
relationship.follower_id = nil
relationship.valid?
expect(relationship.errors[:follower_id]).to include("を入力してください")
end
it "followed_idがnilの場合は保存できない" do
relationship.followed_id = nil
relationship.valid?
expect(relationship.errors[:followed_id]).to include("を入力してください")
end
end
context "一意性の検証" do
before do
@relation = FactoryBot.create(:relationship)
@user1 = FactoryBot.build(:relationship)
end
it "follower_idとfollowed_idの組み合わせは一意でなければ保存できない" do
relation2 = FactoryBot.build(:relationship, follower_id: @relation.follower_id, followed_id: @relation.followed_id)
relation2.valid?
expect(relation2.errors[:follower_id]).to include("はすでに存在します")
end
it "follower_idが同じでもfollowed_idが違うなら保存できる" do
relation2 = FactoryBot.build(:relationship, follower_id: @relation.follower_id, followed_id: @user1.followed_id)
expect(relation2).to be_valid
end
it "follower_idが違うならfollowed_idが同じでも保存できる" do
relation2 = FactoryBot.build(:relationship, follower_id: @user1.follower_id, followed_id: @relation.followed_id)
expect(relation2).to be_valid
end
end
end
describe "各モデルとのアソシエーション" do
let(:association) do
described_class.reflect_on_association(target)
end
context "仮想モデルfollowerとのアソシエーション" do
let(:target) { :follower }
it "Followerとの関連付けはbelongs_toであること" do
expect(association.macro).to eq :belongs_to
end
end
context "仮想モデルfollowedとのアソシエーション" do
let(:target) { :followed }
it "Followedとの関連付けはbelongs_toであること" do
expect(association.macro).to eq :belongs_to
end
end
end
end
보충 설명
테스트 코드의 내용에 대해
다음과 같이 테스트를 크게 4개로 나누어 실시했습니다.
①보존할 수 있는 경우의 정상계
②보존할 수 없는 경우의 이상계
③ 고유성의 담보
④ 각 모델과의 어소시에이션
①, ②에 대해
follower_id와 followed_id의 유무에 의한 밸리데이션을 실시하고 있습니다.
③에 대해
follower_id와 followed_id의 조합을 검증하고 있습니다.
시점으로서는 팔로우되는 측과 팔로우하는 측 크게 2개 있습니다.
한 사용자가 @user1이라고 가정했습니다.
자신과 다른 ID의 경우 팔로우 할 수 있습니다. 즉, 자신이 팔로우 할 수없는 것을 테스트하고 있습니다.
또, 팔로우하는 측은 같은 사람에게는 1회 밖에 팔로우를 할 수 있는 테스트도 실시하고 있습니다.
④에 대해
각 모델과의 어소시에이션의 밸리데이션을 실시하고 있습니다.
이상입니다.
Reference
이 문제에 관하여(【Rails6】 RSpec에 의한 Relationship의 모델 단위 테스트의 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/narimiya/items/11429a0064383fb177ee
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
FactoryBot.define do
factory :relationship do
follower_id { FactoryBot.create(:user).id }
followed_id { FactoryBot.create(:user).id }
end
end
spec/models/relationship_spec.rb
require 'rails_helper'
RSpec.describe Relationship, type: :model do
let(:relationship) { FactoryBot.create(:relationship) }
describe '#create' do
context "保存できる場合" do
it "全てのパラメーターが揃っていれば保存できる" do
expect(relationship).to be_valid
end
end
context "保存できない場合" do
it "follower_idがnilの場合は保存できない" do
relationship.follower_id = nil
relationship.valid?
expect(relationship.errors[:follower_id]).to include("を入力してください")
end
it "followed_idがnilの場合は保存できない" do
relationship.followed_id = nil
relationship.valid?
expect(relationship.errors[:followed_id]).to include("を入力してください")
end
end
context "一意性の検証" do
before do
@relation = FactoryBot.create(:relationship)
@user1 = FactoryBot.build(:relationship)
end
it "follower_idとfollowed_idの組み合わせは一意でなければ保存できない" do
relation2 = FactoryBot.build(:relationship, follower_id: @relation.follower_id, followed_id: @relation.followed_id)
relation2.valid?
expect(relation2.errors[:follower_id]).to include("はすでに存在します")
end
it "follower_idが同じでもfollowed_idが違うなら保存できる" do
relation2 = FactoryBot.build(:relationship, follower_id: @relation.follower_id, followed_id: @user1.followed_id)
expect(relation2).to be_valid
end
it "follower_idが違うならfollowed_idが同じでも保存できる" do
relation2 = FactoryBot.build(:relationship, follower_id: @user1.follower_id, followed_id: @relation.followed_id)
expect(relation2).to be_valid
end
end
end
describe "各モデルとのアソシエーション" do
let(:association) do
described_class.reflect_on_association(target)
end
context "仮想モデルfollowerとのアソシエーション" do
let(:target) { :follower }
it "Followerとの関連付けはbelongs_toであること" do
expect(association.macro).to eq :belongs_to
end
end
context "仮想モデルfollowedとのアソシエーション" do
let(:target) { :followed }
it "Followedとの関連付けはbelongs_toであること" do
expect(association.macro).to eq :belongs_to
end
end
end
end
보충 설명
테스트 코드의 내용에 대해
다음과 같이 테스트를 크게 4개로 나누어 실시했습니다.
①보존할 수 있는 경우의 정상계
②보존할 수 없는 경우의 이상계
③ 고유성의 담보
④ 각 모델과의 어소시에이션
①, ②에 대해
follower_id와 followed_id의 유무에 의한 밸리데이션을 실시하고 있습니다.
③에 대해
follower_id와 followed_id의 조합을 검증하고 있습니다.
시점으로서는 팔로우되는 측과 팔로우하는 측 크게 2개 있습니다.
한 사용자가 @user1이라고 가정했습니다.
자신과 다른 ID의 경우 팔로우 할 수 있습니다. 즉, 자신이 팔로우 할 수없는 것을 테스트하고 있습니다.
또, 팔로우하는 측은 같은 사람에게는 1회 밖에 팔로우를 할 수 있는 테스트도 실시하고 있습니다.
④에 대해
각 모델과의 어소시에이션의 밸리데이션을 실시하고 있습니다.
이상입니다.
Reference
이 문제에 관하여(【Rails6】 RSpec에 의한 Relationship의 모델 단위 테스트의 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/narimiya/items/11429a0064383fb177ee
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(【Rails6】 RSpec에 의한 Relationship의 모델 단위 테스트의 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/narimiya/items/11429a0064383fb177ee텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)