我正在努力从attachment_fu升级到carrierwave,因为attachment_fu在rails 3中被破坏了。
所有测试都无法运行,因为我们有无效的灯具使用attachment_fu的语法来附件文件。
例如,我们有一个Post模型,它有一个PostAttachment。以下是PostAttachment夹具中的数据:
a_image:
post_id: 1
attachment_file: <%= Rails.root>/test/files/test.png
这就是我得到的错误:
ActiveRecord::StatementInvalid: PGError: ERROR: column "attachment_file" of relation "post_attachments" does not exist
LINE 1: INSERT INTO "post_attachments" ("post_id", "attachment_file"...
attachment_fu会选择 attachment_file
,它会处理为模型创建attachment_fu附件的所有处理。
有没有办法在灯具中安装图像附件,但是使用CarrierWave呢?
答案 0 :(得分:19)
我设法让这个工作的唯一方法是使用专门用于测试的存储提供程序来实际保存/读取文件。
在config/initializers/carrier_wave.rb
中添加一个实现存储提供程序最小接口的NullStorage类。
# NullStorage provider for CarrierWave for use in tests. Doesn't actually
# upload or store files but allows test to pass as if files were stored and
# the use of fixtures.
class NullStorage
attr_reader :uploader
def initialize(uploader)
@uploader = uploader
end
def identifier
uploader.filename
end
def store!(_file)
true
end
def retrieve!(_identifier)
true
end
end
然后在初始化CarrierWave时为测试环境添加一个子句,例如,
if Rails.env.test?
config.storage NullStorage
end
以下是gist of my complete carrier_wave.rb供参考。它还包括如何在暂存/生产和本地存储中为上载设置S3以进行开发,以便您可以了解如何在上下文中配置CarrierWave。
配置CarrierWave后,您只需将任何字符串放入灯具列即可模拟上传的文件。
答案 1 :(得分:9)
尝试传递文件而不是String。
a_image:
post_id: 1
attachment_file: File.open(Rails.root.join("test/files/test.png"))
这适用于我使用FactoryGirl
注意:感谢 @dkobozev
答案 2 :(得分:2)
配置/初始化/ carrier_wave.rb
在Rails 4中
# class NullStorage is defined here before the following block
if Rails.env.test?
CarrierWave.configure do |config|
config.storage NullStorage
end
end
&安培;在灯具中:
a_image:
post_id: 1
attachment_file: <%= File.open(Rails.root.join("test/files/test.png")) %>
答案 3 :(得分:1)
为了能够使用已上传文件的灯具以及在测试中上传,我最近玩了一些CarrierWave。我已经写了article关于我是如何做的。
答案 4 :(得分:0)
我知道它很旧,但对于使用Rails 5 + RSpec + CarrierWave + Fixtures的人来说:
编辑测试配置:
# config/initializers/carrierwave.rb
if Rails.env.test?
class NullStorage < CarrierWave::Storage::Abstract
def store!(_file)
_file
end
def retrieve!(identifier)
file = Rails.root.join('spec', 'fixtures', 'files', identifier)
tmp = Rails.root.join('tmp', 'blank_tmp.jpg')
FileUtils.cp(file, tmp)
CarrierWave::SanitizedFile.new(tmp)
end
end
CarrierWave.configure do |config|
config.storage = NullStorage
config.enable_processing = false
end
end
创建一个文件夹和一个文件,例如spec/fixtures/files/some-user-photo.jpg
,然后创建一些灯具,例如:
first_user:
avatar: "some-user-photo.jpg"
name: "First User Name"
about: "First User About Long Text..."
lat: 0.001
lng: 0.001
created_at: <%= Time.current - 3.days %>
updated_at: <%= Time.current - 3.days %>
这足以使测试理解该用户具有avatar
答案 5 :(得分:-4)
我们刚刚将所有灯具一起移除,系统为每次测试播种这些文件。问问自己......这个测试你需要这些灯具吗?不可能不是。和固定装置不要爆炸!所以我们只使用Model.create!( ... )
和测试的特定数据