rspec和carrierwave - 如何直接设置图像URL(测试期间BYPASS carrierwave uploader)

时间:2013-07-18 17:19:26

标签: rspec carrierwave

我正在编写一些rspec规范,其中对象的widgetpic字段需要指向实际图像,但没有使用载波上传器。

在测试中,我只想绕过上传器并手动设置测试图片的网址。具体来说,我在网上有一些测试图片,只是想让foo.widgetpic.url返回一些固定位置:“http://mybucket.s3.amazonaws.com/test_pix/test1.png

Widget模型有:

mount_uploader :widgetpic, WidgetPicUploader

所以在我的FactoryGirl工厂,我认为我需要做这样的事情

trait :test_pic do
   SOMETHING "http://mybucket.s3.amazonaws.com/test_pix/test1.png"
end

我尝试设置widgetpic_url和remote_widgetpic_url,但这不起作用(widgetpic.url仍然返回我的上传器中定义的默认'无图像'图像。)

1 个答案:

答案 0 :(得分:2)

看来你的上传者而不是工厂还有别的东西被打破了。你可以发布你的carrierwave配置吗?

除此之外,远程图像的正确工厂语法是remote_<资源> _url:

trait :test_pic do
  remote_widgetpic_url "http://mybucket.s3.amazonaws.com/test_pix/test1.png"
end

但是,请注意,通过这样做,CarrierWave不会被绕过。 CarrierWave将为您提取远程图像,并使用下载的图像重新上传到您的上传器中指定的位置。您可以将此技术与WebMockVCR结合使用,以模拟和/或记录HTTP请求并进行回放。

更简单的方法可能是使用Fog中内置的模拟功能来模拟测试的上传。这样,您可以在工厂中放置一个虚拟图像:

factory :widget do   
  # ...

  widgetpic Rack::Test::UploadedFile.new(File.open(
    File.join(
      File.dirname(__FILE__), '../fixtures/images/your_image_here.png')))
end

该图片将用于模拟上传,但不会发布到S3上的位置,您可以从端到端测试上传。