RSpec

【RSpec】特定のファイルサイズのテストデータを作成し、バリデーションテストを実装する方法

RSpec

 

今回は特定のファイルサイズのテストデータを作成し、バリデーションテストを実装する方法について紹介したいと思います。ファイルアップロード機能を実装しファイルサイズでバリデーションをかけた際、ファイルサイズのバリデーションテストをしたくなると思います。その際の参考になれば幸いです。

この記事ではファイルアップロード機能にShrineを使用していますが、Paperclipについても解説しています。

ファイルサイズのバリデーション

# frozen_string_literal: true

class ImageUploader < Shrine
  plugin :validation_helpers

  Attacher.validate do
    if file.size.zero?
      errors << 'のサイズが0Bです'
    elsif file.size >= 10.megabytes
      errors << 'は10MBまで添付可能です'
    end
  end
end

ファイルアップロード機能にはShrineを使用し、ファイルサイズに関して2つのバリデーションをかけています。

  1. ファイルサイズが0Bの場合は「のサイズが0Bです」が表示される
  2. ファイルサイズが10MB以上の場合は「は10MBまで添付可能です」が表示される

バリデーションテストの実装

テストデータの作成

まずは0Bと10MB以上(今回は11MB)のファイルを作成します。

% mkfile 0m spec/fixtures/0bytes_sample.png
% mkfile 11m spec/fixtures/11megabytes_sample.png
fixturesフォルダがない場合は、spec以下にfixturesディレクトリを作成してください。

specの編集

先ほど作成したテストデータを用いて、ファイルサイズのバリデーションテストを実装します。Userモデルに対してImageUploaderをアタッチしていると仮定します。

# frozen_string_literal: true

require 'rails_helper'

RSpec.describe User, type: :model do
  describe '#image=' do
    context '0Bの画像をupload' do
      let(:user) { build(:user, image: png_file) }
      let(:png_file) { File.open(Rails.root.join('spec/fixtures/0bytes_sample.png')) }

      before { user.valid? }

      it { expect(user.errors.messages[:image]).to include 'のサイズが0Bです' }
    end

    context '10MB以上の画像をupload' do
      let(:user) { build(:user, image: png_file) }
      let(:png_file) { File.open(Rails.root.join('spec/fixtures/11megabytes_sample.png')) }

      before { user.valid? }

      it { expect(user.errors.messages[:image]).to include 'は10MBまで添付可能です' }
    end
  end
end

(Paperclipを使用している場合)

先ほどはShrineでのバリデーションテストを実装しましたが、Paperclipでファイルアップロード機能を実装している際はshoulda matchers for Paperclipを使用することで簡単にテストを実装することができます。

# spec_helper.rbに以下を追加

require "paperclip/matchers"

RSpec.configure do |config|
  config.include Paperclip::Shoulda::Matchers
end
describe User do
  it { should validate_attachment_size(:image).less_than(10.megabytes) }
end

まとめ

  • テストファイルは「% mkfile 0m spec/fixtures/0bytes_sample.png」のようにLinuxコマンドで作成することができる
  • ファイルアップロード機能にPaperclipを使用している場合は、shoulda matchers for paperclipを用いて簡単にテストすることができる

参考

 

 

今回は特定のファイルサイズのテストデータを作成し、バリデーションテストを実装する方法について紹介しました。この方法を用いることで、同様にファイルサイズの境界値のテストもできそうですね。