원활한 테스트를 위해 알스펙과 팩토리봇 잼을 추가 한다.
Gemfile
group :test do
gem 'factory_bot_rails', '~> 6.1'
gem 'rspec-rails', '~> 4.0', '>= 4.0.2'
end
bundle install
명령어 실행해서 잼 설치
팩토리 작성 : 레코드를 하나하나 수동으로 생성 하는 수고를 덜어준다. 아이디는 auto-increase로, 제목은 임의로 준다. 여기에 Faker잼을 활용 하면 유용한 랜덤 이름들을 지정 하는 것도 가능 하다.
# spec/factories/genres.rb
FactoryBot.define do
factory :genre do
sequence(:id) {|n| n }
title { "테스트 장르1" }
end
end
모델테스트 작성 : 엑티브레코드 테이블에 해당하는 모델을 검증 하는 코드를 추가 한다.
# rspec spec/models/genre_spec.rb --fail-fast
require 'rails_helper'
RSpec.describe Genre, :type => :model do
it "모델 생성 성공 해야 함" do
expect(Genre.new).not_to be_valid
end
it "모델 저장 성공 해야 함" do
genre = FactoryBot.create(:genre)
expect(genre).to be_valid
end
end
문제 없이 잘 성공한다. 이제 더욱 복잡하고 다양한 유즈케이스를 추가 하면 된다.
RSPEC으로 모델 뿐 아니라 리퀘스트를 검증 해볼 수 도 있다.
# rspec spec/requests/user_genres_spec.rb --fail-fast
require 'rails_helper'
RSpec.describe "User Genres API testing", type: :request do
# 기존 장르 클리어
Genre.in_batches(of: 10000).delete_all
it "유저가 아이콘을 클릭 하면 장르 목록이 나와야 한다." do
user1 = FactoryBot.create(:user)
genre1 = FactoryBot.create(:genre)
genre2 = FactoryBot.create(:genre)
# 장르를 얻는다.
get '/api/v1/asks/user_index_genres/', params: {}, headers: {'Authorization' => get_user_token(user1)}
expect(response).to have_http_status(200)
rtv = JSON.parse response.body
genres = rtv['content']['genres']
expect(genres.length).to eq 2
end
end
참고로, 클리어 할때 레일즈 기본 destroy_all
함수는 성능이 최악이기 때문에 아래 라이브러리를 활용 하였다.
gem 'delete_in_batches', '~> 0.2.0'