定义Paperclip在运行Spec测试时在本地存储附件的位置

时间:2015-12-11 02:03:42

标签: ruby-on-rails amazon-s3 paperclip

我使用AmazonS3在所有非test环境中存储Paperclip附件。

对于test,我特意使用本地路径/网址设置来避免远程与S3交互

Paperclip::Attachment.default_options[:path] =
  ":rails_root/public/system/:rails_env/:class/:attachment/:id_partition/:filename"

Paperclip::Attachment.default_options[:url] =
  "/system/:rails_env/:class/:attachment/:id_partition/:filename"

我在模型

中定义我的附件如下
has_attached_file :source_file, use_timestamp: false

在我的生产代码中,需要使用Model.source_file.url访问该文件,因为.url会返回该文件的远程完全限定Amazon S3路径。这通常适用于非test环境。

但是,在test环境中,我无法使用.url,因为Paperclip会在上面:path定义的路径下创建并存储文件。所以我需要使用.path。如果我使用.url,我会收到错误 -

Errno::ENOENT:
  No such file or directory @ rb_sysopen - /system/test/imports/source_files/000/000/030/sample.txt

这是有道理的,因为paperclip没有将文件存储在那里......

如何在test环境中获取回形针以在:url路径下存储/创建我的文件,以便我可以正确使用.url

修改:如果有帮助,请在test中从本地存储的灯具文件创建附件

factory :import do
  source_file { File.new(Rails.root + "spec/fixtures/files/sample.tsv") }
end

Edit2 :将:path:url设置为初始化程序中的相同路径似乎是一个快速修复,但我正在开发更大的应用有几个贡献者,所以我没有奢侈的做法或打破任何其他人的规格。看起来像Thoughtbot自己推荐这个设置,所以应该有一个"正确的"让它按原样运作的方式。

谢谢!

1 个答案:

答案 0 :(得分:0)

您是否尝试在测试环境中使用s3proxy来模拟S3,而不是直接将回形针写入本地文件?