如何让我的CarrierWave模型在测试中将完整的URL返回给我?

时间:2015-06-27 00:33:58

标签: carrierwave

尝试测试carrierwave模型真的很难。我配置了我的测试环境:

if Rails.env.test?
  CarrierWave.configure do |config|
    config.storage = :file
    config.enable_processing = false
    config.fog_directory   = BUCKET                # required
    config.fog_public      = false                 # optional, defaults to true
    config.fog_credentials = {
      :provider               => 'Local',         # required
      :local_root             => LOCAL_ROOT,    # required
      :endpoint               => "http://localhost:3000" # required
    }
  end
else
  CarrierWave.configure do |config|
    config.storage = :fog
    config.max_file_size = 1.gigabytes        # defaults to 5.megabytes
    config.fog_directory   = BUCKET                # required
    config.fog_public      = false                 # optional, defaults to true
    config.fog_credentials = {
      :provider               => PROVIDER,         # required
      :aws_access_key_id      => access_key_id,    # required
      :aws_secret_access_key  => secret_access_key # required
    }
  end
end

它非常适合测试上传。但是,测试下载很困难。

这是一个简单的测试:

require "test_helper"

class UploadTests < ActiveSupport::TestCase

  let(:user) { User.me }
  let(:repo) { Repository.first }
  let(:sub) { user.subscriptions.where(repository_id: repo).first}

  it "uploads a CSV file and lets me read it" do

    filename = Rails.root.join("test/testfiles/product_upload_test.csv").to_s
    upload = sub.uploads.new
    File.open(filename) do |f|
      upload.text_file_name = f
    end
    upload.save!

  end

end

一切都很简单。但我想要做的是从模型中读取文件。换句话说,调用一些CarrierWave API,让我抓取文件并阅读它。

在制作中,我将所有内容存储在S3上。在测试中,一切都在本地文件中。我将local_root设置为我的应用public目录。

CarrierWave仅报告url作为路径,但不包含local_root。我不觉得手动构建我想要从CarrierWave读取的文件的路径是我的职责。存储文件的方式/位置应该从我的测试中隐藏...我应该构建该路径。

但我不知道还能做什么。我想做的就是阅读该文件。

1 个答案:

答案 0 :(得分:0)

我将测试配置更改为以下内容:

CarrierWave.configure do |config|
  config.storage = :file
  config.enable_processing = false
  config.fog_directory     = BUCKET                # required
  config.fog_public        = true                 # optional, defaults to true
  config.fog_credentials = {
    :provider               => 'Local',         # required
    :local_root             => LOCAL_ROOT,    # required
    :endpoint               => LOCAL_ROOT # required
  }
end

现在返回完整的网址。