今回は特定のファイルサイズのテストデータを作成し、バリデーションテストを実装する方法について紹介したいと思います。ファイルアップロード機能を実装しファイルサイズでバリデーションをかけた際、ファイルサイズのバリデーションテストをしたくなると思います。その際の参考になれば幸いです。
ファイルサイズのバリデーション
# 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つのバリデーションをかけています。
- ファイルサイズが0Bの場合は「のサイズが0Bです」が表示される
- ファイルサイズが10MB以上の場合は「は10MBまで添付可能です」が表示される
バリデーションテストの実装
テストデータの作成
まずは0Bと10MB以上(今回は11MB)のファイルを作成します。
% mkfile 0m spec/fixtures/0bytes_sample.png
% mkfile 11m spec/fixtures/11megabytes_sample.png
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を用いて簡単にテストすることができる
参考
- Shrine
- Paperclip
- Module: Paperclip::Shoulda::Matchers
- How can I use Rspec to test that a model using Paperclip is validating the size of an uploaded file?
今回は特定のファイルサイズのテストデータを作成し、バリデーションテストを実装する方法について紹介しました。この方法を用いることで、同様にファイルサイズの境界値のテストもできそうですね。