使用Capybara进行测试时,Carrierwave无法找到文件

时间:2014-06-12 01:27:20

标签: ruby-on-rails capybara carrierwave

我正在尝试编写一个涉及使用Carrierwave上传的文件的集成测试。我有以下配置:

CarrierWave.configure do |config|
  if Rails.env.test?
    config.storage = :file
    config.enable_processing = false
  else
    # other configs
  end
end

我的上传器将商店路径设置为:

def store_dir                                                                    
  "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"             
end

结果是文件存储在public/uploads中。但是当我尝试通过我的模型上的doc.url方法访问此文件时,它返回一个类似/uploads/...的路径,并且在运行我的集成规范时,我收到以下错误:

unable to open file `/uploads/doc/paper/1/img_1.png'

我可以确认该文件确实存在于/public/uploads目录中。如何让Carrierwave返回上传图像的正确路径?我可以将它与Rails.root.join('public', doc.url)一起修补,但这会在我们上传到S3的生产中中断。

1 个答案:

答案 0 :(得分:0)

经过调查后,我意识到这里的问题是我们正在尝试访问文件服务器端。客户端一切正常,因为它使用相对路径,Rails将其解析为资产路径。服务器端它不知道在哪里看。在开发和生产中我们使用S3,因此url在任何一种方式都是相同的。这感觉有点像黑客,但我们需要访问服务器上的图像,我们这样做了:

path = Rails.env.test? ? doc.img.path : doc.url
file = File.open(path)

我无法找到与环境无关的方法来解决这个问题。