【Rails】RSpec에 의한 ActiveStorege로 업로드한 이미지 테스트

7458 단어 RSpecRails

소개



RSpec으로 모델 테스트를 쓰고 있을 때 ActiveStorage에서 모델에 관련시킨 이미지의 밸리데이션 곳에서 집계했기 때문에 메모.
RSpec과 FactoryBot을 사용한다. (여기에서는 설치 부분은 생략)

할 일



음악 리뷰 앱의 Record 모델에 붙인 이미지( :jacket )가 비었을 때는 에러를 표시한다.

모델



Record 모델은 Genre 모델을 묶고 있습니다.

Genre 모델은 (일부 생략)

app/models/genre.rb
class Genre < ApplicationRecord
  has_many :records
end

Record 모델은 (일부 생략)

app/models/record.rb
class Record < ApplicationRecord
  belongs_to :genre
  has_one_attached :jacket #一つの画像

  validate :jacket_presence #画像のバリデーション

  def jacket_presence
    unless jacket.attached?
      errors.add(:jacket, 'must be attached')
    end
  end
end
has_one_attached :jacketjacket_presence 메서드에 이미지가 없으면 오류 메시지를 추가합니다.
  

테스트용 이미지 준비



  우선 public 디렉토리에 jackets 파일을 추가하고,
거기에 하나의 이미지를 추가합니다.


여기에 justin.jpg 파일이 public/jackets에 추가되었습니다.
  

FactoryBot 편집



우선은 Genre 를 편집한다.

spec/factories/genre.rb
FactoryBot.define do
  factory :genre do
    name { "Pop" }
  end
end

다음은 Record 를 편집한다.

spec/factories/record.rb
FactoryBot.define do
  factory :record do
    name { "Justice" }
    release_year { 2021 }
    artist { "Justin Bieber" }

    #genreとのアソシエーションは、
    #genre_id { 1 } でなく、以下のように書く
    genre

    #recordモデル作成後:jacketを関連づける。
    after(:build) do |record|
      record.jacket.attach(io: File.open('public/jackets/justin.jpg'), filename: 'justin.jpg')
    end
  end
end


이것으로 테스트용 모델 작성 준비가 완료.
  

테스트 파일 편집


Record 의 모델 테스트를 편집한다.

spec/models/record_spec.rb
require 'rails_helper'

RSpec.describe Record, type: :model do

  describe 'create new record'do

    before do #テスト用のRecordを作成
      genre = FactoryBot.create(:genre)
      @record = FactoryBot.create(:record)
    end

  #全ての項目があれば有効。
    context 'with a name, release_year, artist, genre, and jacket' do
      it "is valid" do
        record = @record
        expect(record).to be_valid
      end
    end

    #:jacketなしの場合はエラー
    context 'without a jacket' do
      it "is invalid" do
        @record.jacket = nil #:jacketを空にする。
        record = @record

        record.valid?
        #エラーメッセージが追加される。
        expect(record.errors[:jacket]).to include("must be attached")
      end
    end

  end 
end

RecordGenre 에 묶여 있기 때문에 먼저 genre 를 만들고 있다.

이제 테스트 할 수있었습니다.
  

좋은 웹페이지 즐겨찾기