[RUBY] Bild-Upload mit CarrierWave ~ Rspec-Test ~

Referenzmaterial

carrierwaveuploader/carrierwave

Rspec mit CarrierWave zum Hochladen mehrerer Bilder - Qiita

[Rails] Einführung von Carrierwave und MiniMagick, wenn Sie mehrere Bilder speichern möchten - Qiita

Einführung

gem 'carrierwave', '~> 2.0'

Erstellen Sie nach der Bundle-Installation einen Uploader

be rails g uploader Images

app / uploaders / images_uploader.rb wird erstellt.

Inhalt

class ImagesUploader < CarrierWave::Uploader::Base
  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  # include CarrierWave::MiniMagick

  # Choose what kind of storage to use for this uploader:
  storage :file
  # storage :fog

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  # Provide a default URL as a default if there hasn't been a file uploaded:
  # def default_url(*args)
  #   # For Rails 3.1+ asset pipeline compatibility:
  #   # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png "].compact.join('_'))
  #
  #   "/images/fallback/" + [version_name, "default.png "].compact.join('_')
  # end

  # Process files as they are uploaded:
  # process scale: [200, 300]
  #
  # def scale(width, height)
  #   # do something
  # end

  # Create different versions of your uploaded files:
  # version :thumb do
  #   process resize_to_fit: [50, 50]
  # end

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
  # def extension_whitelist
  #   %w(jpg jpeg gif png)
  # end

  # Override the filename of the uploaded files:
  # Avoid using model.id or version_name here, see uploader/store.rb for details.
  # def filename
  #   "something.jpg " if original_filename
  # end
end

Bildspalte zur Bildtabelle hinzugefügt. (Bereits beim Erstellen der Bildtabelle mit der Post-Tabelle verknüpft)

Wenn Sie mehrere Dateien hochladen, wird diese anscheinend im JSON-Format gespeichert. Geben Sie sie daher an.

be rails g migration add_images_to_image images:json

Inhalte migrieren

class AddImagesToImage < ActiveRecord::Migration[6.0]
  def change
    add_column :images, :images, :json
  end
end

Rails DB: Migrieren, um Spalten hinzuzufügen

Testimplementierung

models/image.rb

class Image < ApplicationRecord
  belongs_to :post
  validates :images, presence: true

  mount_uploaders :images, ImagesUploader
end

spec/factories/images.rb

FactoryBot.define do
  factory :image do
    images { [ Rack::Test::UploadedFile.new(Rails.root.join('spec/fixtures/test.jpg'), 'spec/fixtures/test.jpg') ] }
    post
  end
end

Erstellen Sie ein Fixtures-Verzeichnis unter dem Spec-Verzeichnis. Ich habe test.jpg pseudo erstellt.

spec/models/images.rb

require "rails_helper"

RSpec.describe Image, type: :model do
  let(:pic_path) { Rails.root.join('spec/fixtures/test.jpg') }
  let(:pic) { Rack::Test::UploadedFile.new(pic_path) }

  context "Wenn ein Bild angegeben ist" do
    it "Bild wird hochgeladen" do
      image = create(:image)
      expect(image).to be_valid
    end

    it "Bild(Mehrere)Aber hochgeladen" do
      image = create(:image, images: [pic, pic])
      binding.pry
      expect(image).to be_valid
    end
  end

  context "Wenn kein Bild angegeben ist" do
    it "Erhalten Sie einen Fehler" do
      image = build(:image, images: nil)
      expect(image).to be_invalid
      expect(image.errors.messages[:images]).to eq ["can't be blank"]
    end
  end
end

Recommended Posts

Bild-Upload mit CarrierWave ~ Rspec-Test ~
[Rails] Testcode mit Rspec
So löschen Sie das Testbild, nachdem Sie den Rspec-Test mit CarrierWave ausgeführt haben
[RSpec] Unit Test (mit gem: factory_bot)
[Rails] So laden Sie Bilder mit Carrierwave hoch
[Java] Test S3 Upload / Download mit "S3 Ninja"
[Rails] So laden Sie mehrere Bilder mit Carrierwave hoch
[RSpec] Ich habe einen Test zum Hochladen eines Profilbilds geschrieben.
Ausführung des RSpec-Testcodes
CarrierWave Laden Sie mehrere Bilder hoch
[Rails / RSpec] Schreiben Sie einen Modelltest (mit Shoulda Matchers / FactoryBot)
[Schienen] Test mit RSpec
Testen Sie Nokogiri mit Rspec.
[RSpec] Verwenden Sie WebMock, um die Logik mithilfe einer externen API zu testen
[Schienen] Speichern Sie Bilder mit Carrierwave
Testen Sie Active Strage mit RSpec
Unit-Test der Architektur mit ArchUnit
Testen Sie den GraphQL-Resolver mit rspec
[Rails] Informationen zum Rspec-Antworttest
[Rails] So laden Sie Bilder mit Carrierwave und Fog-Aws in AWS S3 hoch