在 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 StringIO
子StringIO
为这样的内容:
class StringIOWithName < StringIO
def initialize(stream, filename)
super(stream)
@original_filename = filename
end
attr_reader :original_filename
end
然后你可以给Carrierwave一个StringIOWithName
的实例。
我正在尝试 运行 使用模型进行测试,但我正在尝试不必在这里真正使用文件。
我的用例在 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 StringIO
子StringIO
为这样的内容:
class StringIOWithName < StringIO
def initialize(stream, filename)
super(stream)
@original_filename = filename
end
attr_reader :original_filename
end
然后你可以给Carrierwave一个StringIOWithName
的实例。