在 Rails 中使用 rspec 无法使用没有真实文件的 CarrierWave 模型

Can't use a model using CarrierWave without a real file in Rails using rspec

我正在尝试 运行 使用模型进行测试,但我正在尝试不必在这里真正使用文件。

我的用例在 rspec 我尝试使用由 CarrierWave 使用 FactoryBot 处理的 属性 创建该对象,但我不知道要传递给我的 icon 属性 真实文件除外。

我的模型是这样的:

class MyItem < ApplicationRecord
  validates :icon, presence: true

  mount_uploader :icon, MyIconUploader
end

使用 FactoryBot,当我尝试 运行 create 我有这个错误:

     ActiveRecord::RecordInvalid:
       Validation failed: Icon can't be blank

唯一有效的似乎是以下内容:

FactoryBot.define do
  factory :item, class: 'MyItem' do
    icon { Rack::Test::UploadedFile.new(File.join(Rails.root, 'spec', 'assets', 'images', 'image.jpg')) }
  end
end

从内存中给它一个文件对我也有用,只要它不是物理文件。

您可以使用 StringIO class。由于 CarrierWave 还需要给定 IO 对象上的文件名,因此您还需要将 class StringIOStringIO 为这样的内容:

class StringIOWithName < StringIO
  def initialize(stream, filename)
    super(stream)
    @original_filename = filename
  end

  attr_reader :original_filename
end

然后你可以给Carrierwave一个StringIOWithName的实例。