Rails 3测试夹具与carrierwave?

时间:2011-09-23 20:16:03

标签: ruby-on-rails ruby-on-rails-3 unit-testing fixtures carrierwave

我正在努力从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呢?

6 个答案:

答案 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!( ... )和测试的特定数据