###目的
Railsアプリの開発中に、Model側でも画像データのバリデーションが有効か調べる。
###前提
- Rails に ActiveStorage 導入済
- Rails に RSpec・FactoryBot 導入済
- model spec 作成済
Format
- (削除箇所)
+ (追加箇所)
####開発環境
- Rails 6.1.3
- Ruby 2.7.3
- AWS Cloud9 (Ubuntu 18.04.5)
- RSpec 3.10 (rspec-rails 4.0.2)
- FactoryBot
ディレクトリ構成
myapp
├── app ── models
(省略)
├── spec
├── factories
├── fixtures
└── models
(省略)
└── (省略)
###設定
- rails_helper.rb の設定
spec/rails_helper.rb
(省略)
RSpec.configure do |config|
(省略)
+ config.include ActionDispatch::TestProcess::FixtureFile
end
-
[ActionDispatch::TestProcess::FixtureFile - api.rubyonrails.org] (https://api.rubyonrails.org/classes/ActionDispatch/TestProcess/FixtureFile.html)
他の先駆者の方の設定方法もありますので、参考URLもあわせてご覧ください。(私の場合は下記の参考URLの方法ではなぜか解決できませんでした...)
###ディレクトリ作成
Terminal
$ mkdir -p spec/fixtures/files/image
上記で作成するディレクトリ'files'は、後ほどテストで実行するfixture_file_uploadメソッドのルートディレクトリとなります。
###テストデータ作成
先ほど作成したディレクトリにテスト用のデータを作成。
- ファイルのサイズを指定してダミーデータ作成(下記の例は jpeg 6MB)
Terminal
$ dd if=/dev/zero of=/home/ubuntu/environment/myapp/spec/fixture/image-test-6mb.jpeg bs=1M count=6
ddコマンド ダミーデータ生成 - Qiita
dd コマンド – ファイルをコピー | Linuxコマンド.NET
###モデル側の検証
app/models/post.rb
class Post < ApplicationRecord
has_one_attached :image
validates :content, presence: true
+ validates :image, size: { less_than: 5.megabytes, \
message: "should be less than 5MB" }
end
テストを書く
spec/factories/posts.rb
FactoryBot.define do
factory :post do
id { 1 }
content { "Good" }
end
end
spec/models/post_spec.rb
require 'rails_helper'
RSpec.describe Post, type: :model do
# 6MB以上の画像アップロードは無効であること
it "is invalid with an image data greater then 6MB" do
post = FactoryBot.build(:post)
post.image = fixture_file_upload("image/image_test_6mb.jpeg")
expect(post.valid?).to eq false
end
end
###単体テスト実行
Terminal
$ bin/rspec spec/models/posts.rb
###参考URL