【问题标题】:Carrierwave can't find file when testing with Capybara使用 Capybara 进行测试时,Carrierwave 找不到文件
【发布时间】:2014-06-12 01:27:20
【问题描述】:

我正在尝试编写一个涉及使用 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 的地方中断生产。

【问题讨论】:

    标签: ruby-on-rails capybara carrierwave


    【解决方案1】:

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

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

    我无法找到一种与环境无关的方法来处理这个问题。

    【讨论】:

    • expect_any_instance_of 并在url 上返回path
    • 是的,这就是我们在测试中最终为其中一些人所做的。
    猜你喜欢
    • 1970-01-01
    • 2017-05-18
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多